kl距离 java_KL距离的计算
之前说过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距离的计算相关推荐
- kl距离 java_KL距离,Kullback-Leibler Divergence
http://www.cnblogs.com/ywl925/p/3554502.html http://www.cnblogs.com/hxsyl/p/4910218.html http://blog ...
- ML:图像数据、字符串数据等计算相似度常用的十种方法(余弦相似性、皮尔逊、闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离、马氏距离、汉明距离、编辑距离、杰卡德相似系数、相对熵/KL散度、Helli
ML:图像数据.字符串数据等计算相似度常用的十种方法(余弦相似性.皮尔逊.闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离.马氏距离.汉明距离.编辑距离.杰卡德相似系数.相对熵/KL散度.Helli ...
- R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离
R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...
- 【机器学习基础】机器学习中“距离与相似度”计算汇总
写在前面 涵盖了常用到的距离与相似度计算方式,其中包括欧几里得距离.标准化欧几里得距离.曼哈顿距离.汉明距离.切比雪夫距离.马氏距离.兰氏距离.闵科夫斯基距离.编辑距离.余弦相似度.杰卡德相似度.Di ...
- 【机器学习基础】机器学习距离与相似度计算
写在前面 涵盖了常用到的距离与相似度计算方式,其中包括欧几里得距离.标准化欧几里得距离.曼哈顿距离.汉明距离.切比雪夫距离.马氏距离.兰氏距离.闵科夫斯基距离.编辑距离.余弦相似度.杰卡德相似度.Di ...
- 点至直线的距离和垂足点计算
点至直线的距离和垂足点计算 //点到直线的垂足点 public static Coordinate getFootPoint(Coordinate point, Coordinate pnt1, Co ...
- 相关公式如下:v=at;s=1/2*a*t2;其中v是速度,a是加速度,t是时间,s是距离。编写程序计算该飞机的加速度。
题目描述 一个喷气式战斗机从航空母舰上的弹射器出发后的加速度a(单位:m/s^2),其中已知飞机的起飞速度v(km/h)和 弹射器对飞机从停止到起飞的加速的距离s(单位:m).这里假定飞机做匀加速运动 ...
- 网络范围和计算机,按照网络覆盖的地理范围和计算机之间互联的距离,可将计算视网络分为()。...
按照网络覆盖的地理范围和计算机之间互联的距离,可将计算视网络分为(). 更多相关问题 下列选项中,不属于工程项目管理规划大纲作用的是( ). 支付赋税.租金.工资的货币发挥的是() A closed- ...
- 经纬度,距离,方位角相关计算(Java实现)
经纬度,距离,方位角相关计算(Java实现) 问题:已知地点1.地点3的经纬度和地点2相对于地点1的方位角和距离,求地点2相对于地点3的方位角和距离. 要解决这个问题,可以分为两步实现: 1.根据一点 ...
- 【思维导图】机器学习中的几种常见距离与相似度计算
[全网最细致]机器学习距离与相似度计算 欧几里得距离 o如果我们将两个点分别记作(p1,p2,p3,p4-)和(q1,q2,q3,14,-),则欧几里得距离的计算公式为: ofrom math im ...
最新文章
- Python中函数的参数定义和可变参数
- Hyperledger Fabric Rest API服务开发教程【含源码】
- springboot启动时An attempt was made to call a method that does not exist
- android打包过程
- Spring 3 MVC异常处理程序
- 配置nginx作为静态资源服务器 css,js,image等资源直接访问
- 十六进制转八进制(java)
- JSP 获取访问者真正的IP地址
- SSM框架下分页的实现(封装page.java和List?)
- 空间说说html,适合发空间说说的经典心情短语
- C++ socket编程select模型
- MVC 《web考勤管理系统》 项目研发文献
- vbs整人小程序集合
- 华为HG8245C光猫破解用户连接数限制
- SecureCRT免费安装教程
- 中国IT的领路人——播布客
- 风青杨:马云为何被浙商“炮…
- Solaris 问答集
- 【presto】presto 常用的命令
- Solidity如何通过代码减少gas消耗