之前说过Kullback-Leibler,KL距离是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对熵(Relative Entropy),今天首先用java简单的实现了两段文字的KL距离。java代码如下:

1 importjava.io.BufferedReader;2 importjava.io.FileInputStream;3 importjava.io.FileNotFoundException;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.util.ArrayList;7 importjava.util.regex.Matcher;8 importjava.util.regex.Pattern;9 importjeasy.analysis.MMAnalyzer;10

11 public classEntity {12 String word;//存储字符

13 float pValue;//存储该字符对应的概率值

14 public Entity()//类的构造函数

15 {16 pValue=0;17 word="";18 }19

20 //读取文件

21 public static String GetFileText(String path) throwsFileNotFoundException,IOException22 {23 InputStreamReader inStreamReader=new InputStreamReader(new FileInputStream(path),"UTF-8");24 //String strFile1=

25 BufferedReader bufReader=newBufferedReader(inStreamReader);26 String line;27 StringBuilder sb=newStringBuilder();28 while((line=bufReader.readLine())!=null)29 {30 sb.append(line+" ");31 }32 inStreamReader.close();33 bufReader.close();34 String strFile=sb.toString();35 returnstrFile;36 }37

38 //分割字符39 //分词

40 public static String CutText(String path)throwsFileNotFoundException,IOException41 {42

43 String fileText=GetFileText(path);44 MMAnalyzer analyzer=newMMAnalyzer();45 String result =null;46 String spliter="|";47 try

48 {49 result =analyzer.segment(fileText, spliter);50 }51 catch(IOException e)52 {53 e.printStackTrace();54 }55 //System.out.print(result);

56 returnresult;57 }58 //分单字

59 public static String CutTextSingleCharacter(String path)throwsFileNotFoundException,IOException60 { String text=GetFileText(path);61 String proText=null;62 Pattern pattern=Pattern.compile("[\\u4E00-\\u9FA5\\uF900-\\uFA2D]");63 Matcher m=pattern.matcher(text);64 StringBuffer sb=newStringBuffer();65 Boolean flag=m.find();66 while(flag)67 {68 int start=m.start();69 int end=m.end();70 sb.append(text.substring(start, end)+"|");71 //System.out.println(text.substring(start,end));

72 flag=m.find();73 }74 proText=sb.toString();75 returnproText;76 }77

78 //计算字符的概率

79 public static ArrayList CalcuP(String path) throwsIOException80 { //以词为单位计算相对熵81 //String result=CutText(path);82 //以字为单位计算相对熵

83 String result=CutTextSingleCharacter(path);84 String []words=result.split("\\|");85

86 ArrayList enList=newArrayList();87 for(String w: words)88 { w=w.trim();89 Entity en=newEntity();90 en.word=w;91 en.pValue=1;92 enList.add(en);93 //System.out.println(w);

94 }95

96 float total=enList.size();97 for(int i=0;i

100 if(!enList.get(i).word.isEmpty())101 {102 for(int j=i+1;j=0;i--)114 {115 if(enList.get(i).pValue<1.0)116 enList.remove(i);117 }118 for(int i=0;i

125 //计算相对熵

126 /*用于计算两段文本的相对熵*/

127 public static float CalKL(ArrayListp,ArrayListq)128 {129 float kl=0;130 float infinity=10000000;//无穷大

131 double accretion=infinity;//设置熵增加量的初始值为无穷大。132 //从q中找出与p中相对应词的概率,如果找到了,就将accretion的值更新,并累加到相对熵上面;如果没找到,则增加了为无穷大

133 for(int i=0;i

=0;j--)137 {138 if(p.get(i).word.equals(q.get(j).word))139 { accretion=p.get(i).pValue*Math.log(p.get(i).pValue/q.get(j).pValue);140 //q.remove(j);

141 break;142 }143 }144 kl+=accretion;145 accretion=infinity;146 }147 }148 returnkl;149 }150

151 //结果分析152 //主函数代码

153 public static void main(String[] args) throwsFileNotFoundException,154 IOException{155 //TODO Auto-generated method stub156 //TODO Auto-generated method stub;

157 ArrayList enList1=new ArrayList();158 enList1=CalcuP("D:/JavaDemo/KL资料/zhangailing.txt");159 ArrayList enList2=new ArrayList();160 enList2=CalcuP("D:/JavaDemo/KL资料/zhangailing2.txt");161 ArrayListenList3=new ArrayList();162 enList3=CalcuP("D:/JavaDemo/KL资料/maozedong.txt");163 double f1=CalKL(enList1,enList2);164 double f2=CalKL(enList2,enList1);165 double f3=CalKL(enList1,enList3);166 double f4=CalKL(enList3,enList1);167 double f5=CalKL(enList2,enList3);168 double f6=CalKL(enList3,enList2);169 System.out.println("《《小团圆》究竟泄了张爱玲什么“秘密”?》与《《小团圆》:张爱玲的一个梦》的KL距离: "+f1);170 System.out.println("《《小团圆》:张爱玲的一个梦》与《《小团圆》究竟泄了张爱玲什么“秘密”?》的KL距离: "+f2);171 System.out.println("《《小团圆》究竟泄了张爱玲什么“秘密”?》与《1945年毛和蒋介石在重庆谈判前的秘密情报战》的KL距离: "+f3);172 System.out.println("《1945年毛和蒋介石在重庆谈判前的秘密情报战》与《《小团圆》究竟泄了张爱玲什么“秘密”?》的KL距离: "+f4);173 System.out.println("《“小团圆”张爱玲的一个梦》与《1945年毛和蒋介石在重庆谈判前的秘密情报战》的KL距离: "+f5);174 System.out.println("《1945年毛和蒋介石在重庆谈判前的秘密情报战》与《“小团圆”张爱玲的一个梦》的KL距离: "+f6);175 }176 }

下面是结果:

其中第九行和第四十四行代码在eclipse中会提示错误,暂时没有解决,但是也不影响程序运行,运行也不报错,在网上查了一下,有说是缺少导入包,但是我导入所需要的包后,还是显示错误,可能是包的版本不对吧,用的是3.6.0版本的,这个问题还有待解决。代码来源于http://finallyliuyu.iteye.com/blog/609462。

另外,关于MMAnalyzer 中文分词组件的问题,这个中文分词组件支持英文、数字、中文(简体)混合分词 /常用的数量和人名的匹配 /超过22万词的词库整理 /实现正向最大匹配算法 .

有关MMAnalyzer的使用如下:

//采用正向最大匹配的中文分词算法,相当于分词粒度等于0

MMAnalyzer analyzer = new MMAnalyzer();

//参数为分词粒度:当字数等于或超过该参数,且能成词,该词就被切分出来

MMAnalyzer analyzer = new MMAnalyzer(2);

//增加一个新词典,采用每行一个词的读取方式

MMAnalyzer.addDictionary(reader);

//增加一个新词

MMAnalyzer.addWord(newWord);

//删除词库中的全部词语(注意:非常危险的操作,在没有加载新的词库前所有的分词都将失效)

MMAnalyzer.clear();

//词库中是否包含该词

MMAnalyzer.contains(String word);

//从词库中移除该词

MMAnalyzer.removeWord(String word);

//当前词库中包含的词语总数

MMAnalyzer.size();

另外,对于计算KL距离的matlab代码如下:

clearvars%generate random data

class_a= randn(30,1);

class_b= 5+randn(30,1);

x=[class_a; class_b];%calculate the params fornormpdf

mu_a=mean(class_a);

mu_b=mean(class_b);

sig_a=std(class_a);

sig_b=std(class_b);

testpoints=linspace(min(x), max(x));%generate mix gaussians

p_mix= normpdf(testpoints,mu_a,sig_a)/2 + normpdf(testpoints,mu_b,sig_b)/2;%calculate two kernel density

[p_ks_default,dum,width_default]=ksdensity(x,testpoints);

p_ks_half_default= ksdensity(x,testpoints,'bandwidth',width_default/2);%calculate histogram probability

[c_hist,centers_hist]= hist(x,20);

p_hist= c_hist/60;%we have 60data instances

p_hist= p_hist + 0.00001;%avoid all the zeros%we need to generate true distribution vector over 20instances provided by histogram

p_mix_20= normpdf(centers_hist,mu_a,sig_a)/2 + normpdf(centers_hist,mu_b,sig_b)/2;

kld_ks_default= sum(p_mix .* log(p_mix ./p_ks_default));

kld_ks_half_default= sum(p_mix .* log(p_mix ./p_ks_half_default));

kld_histo= sum(p_mix_20 .* log(p_mix_20 ./p_hist));

figure

plot(testpoints,p_mix);

title('True distribution');

figure

plot(testpoints,p_ks_default);

title(['Kernel density (default width), KLD = 'num2str(kld_ks_default)]);

figure

plot(testpoints,p_ks_half_default);

title(['Kernel density (half default width), KLD = 'num2str(kld_ks_half_default)]);

figure

hold on

hist(x,20);%plot(centers_hist,p_mix_20);%plot(centers_hist,p_hist);

title(['Histogram (20 bins), KLD = ' num2str(kld_histo)]);

效果如下:

真实分布是用normpdf计算出来的

Kernel Density, 默认宽度

Kernel Density, 默认宽度/2

Histogram

它们的原理是先生成两个分布,并且生成它们的ksdensity和histogram, 最后计算ksdensity 和 histogram与真实分布的KL距离。

kl距离 java_KL距离的计算相关推荐

  1. kl距离 java_KL距离,Kullback-Leibler Divergence

    http://www.cnblogs.com/ywl925/p/3554502.html http://www.cnblogs.com/hxsyl/p/4910218.html http://blog ...

  2. ML:图像数据、字符串数据等计算相似度常用的十种方法(余弦相似性、皮尔逊、闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离、马氏距离、汉明距离、编辑距离、杰卡德相似系数、相对熵/KL散度、Helli

    ML:图像数据.字符串数据等计算相似度常用的十种方法(余弦相似性.皮尔逊.闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离.马氏距离.汉明距离.编辑距离.杰卡德相似系数.相对熵/KL散度.Helli ...

  3. R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离

    R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...

  4. 【机器学习基础】机器学习中“距离与相似度”计算汇总

    写在前面 涵盖了常用到的距离与相似度计算方式,其中包括欧几里得距离.标准化欧几里得距离.曼哈顿距离.汉明距离.切比雪夫距离.马氏距离.兰氏距离.闵科夫斯基距离.编辑距离.余弦相似度.杰卡德相似度.Di ...

  5. 【机器学习基础】机器学习距离与相似度计算

    写在前面 涵盖了常用到的距离与相似度计算方式,其中包括欧几里得距离.标准化欧几里得距离.曼哈顿距离.汉明距离.切比雪夫距离.马氏距离.兰氏距离.闵科夫斯基距离.编辑距离.余弦相似度.杰卡德相似度.Di ...

  6. 点至直线的距离和垂足点计算

    点至直线的距离和垂足点计算 //点到直线的垂足点 public static Coordinate getFootPoint(Coordinate point, Coordinate pnt1, Co ...

  7. 相关公式如下:v=at;s=1/2*a*t2;其中v是速度,a是加速度,t是时间,s是距离。编写程序计算该飞机的加速度。

    题目描述 一个喷气式战斗机从航空母舰上的弹射器出发后的加速度a(单位:m/s^2),其中已知飞机的起飞速度v(km/h)和 弹射器对飞机从停止到起飞的加速的距离s(单位:m).这里假定飞机做匀加速运动 ...

  8. 网络范围和计算机,按照网络覆盖的地理范围和计算机之间互联的距离,可将计算视网络分为()。...

    按照网络覆盖的地理范围和计算机之间互联的距离,可将计算视网络分为(). 更多相关问题 下列选项中,不属于工程项目管理规划大纲作用的是( ). 支付赋税.租金.工资的货币发挥的是() A closed- ...

  9. 经纬度,距离,方位角相关计算(Java实现)

    经纬度,距离,方位角相关计算(Java实现) 问题:已知地点1.地点3的经纬度和地点2相对于地点1的方位角和距离,求地点2相对于地点3的方位角和距离. 要解决这个问题,可以分为两步实现: 1.根据一点 ...

  10. 【思维导图】机器学习中的几种常见距离与相似度计算

    [全网最细致]机器学习距离与相似度计算 欧几里得距离 o如果我们将两个点分别记作(p1,p2,p3,p4-)和(q1,q2,q3,14,-),则欧几里得距离的计算公式为: ofrom math im ...

最新文章

  1. Python中函数的参数定义和可变参数
  2. Hyperledger Fabric Rest API服务开发教程【含源码】
  3. springboot启动时An attempt was made to call a method that does not exist
  4. android打包过程
  5. Spring 3 MVC异常处理程序
  6. 配置nginx作为静态资源服务器 css,js,image等资源直接访问
  7. 十六进制转八进制(java)
  8. JSP 获取访问者真正的IP地址
  9. SSM框架下分页的实现(封装page.java和List?)
  10. 空间说说html,适合发空间说说的经典心情短语
  11. C++ socket编程select模型
  12. MVC 《web考勤管理系统》 项目研发文献
  13. vbs整人小程序集合
  14. 华为HG8245C光猫破解用户连接数限制
  15. SecureCRT免费安装教程
  16. 中国IT的领路人——播布客
  17. 风青杨:马云为何被浙商“炮…
  18. Solaris 问答集
  19. 【presto】presto 常用的命令
  20. Solidity如何通过代码减少gas消耗

热门文章

  1. DirectX修复工具使用技巧之三——命令行与配置文件参数介绍
  2. dnf红眼补丁在哪下载_dnf补丁下载到哪里
  3. 《细说PHP》分页源代码
  4. linux耳机的检测原理,耳机检测原理介绍
  5. c语言数独合法验证,JavaScript数独验证
  6. Linux配置静态IP 详细截图
  7. 达梦数据库常用管理工具简介
  8. 浙江利捷分析报告(0608)
  9. 奶茶店收银系统php版,奶茶店收银系统
  10. JS编程练习题(javascript)