python实现:KL距离、jensen-shannon距离
来源:互联网 发布:linux wget命令 404 编辑:程序博客网 时间:2024/05/18 20:48
Kullback–Leibler divergence:KL距离,是从信息熵的角度出发,也叫相对熵,衡量相同事件空间里的两个概率分布之间的差异情况。
计算公式:
=p、q的交叉熵 - p的信息熵
性质:(1)kl(P||Q) >= 0,无最大值 (2)不对称 KL(P||Q) != KL(Q||P) (3)不满足三角不等式
问题来了:概率分布中p、q为0的情况如何处理?“log of zero”报错在python中如何解决?
一个简单的办法,给概率分布都加一个极小的值,使概率值不为0,而对概率分布又没有什么影响。
matlab中有esp表示最小值,python中的numpy库有spacing函数表示最小值,
</pre><pre name="code" class="python">import numpy as npfrom math import logdef KLD(p,q): p,q=zip(*filter(lambda (x,y): x!=0 or y!=0, zip(p,q))) #去掉二者都是0的概率值 p=p+np.spacing(1) q=q+np.spacing(1) print p,q return sum([_p * log(_p/_q,2) for (_p,_q) in zip(p,q)])p=np.ones(5)/5.0q=[0,0,0.5,0.2,0.3]print KLD(p,q)结果:19.489850642923379
<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);"><strong></strong></span>
<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);"><strong>改进</strong></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">:由于它的不对称性,不能完全表示两个分布之间的单向关系,因此有人提出了Jensen-Shannon距离,计算每个分布与平均分布的KL距离再去均值。</span>
M=(P+Q)/2
JSD=1/2*KL(P||M) +1/2*KL(Q||M)
当log的底数为2时,JSD的取值范围【0,1】
当log的底数为e时,JSD的取值范围【0,log(e,2)】
应用举例:计算两个字符串的字母分布距离。
如: ‘absfjowswls’ 和 ‘ahoafbaqqq’ 中每个字母出现的概率的分布有何差异?
import stringfrom math import logimport numpy as npKLD=lambda p,q:sum([_p * log(_p,2)-_p * log(_q,2) for (_p,_q) in zip(p,q)])def JSD_core(p,q): p,q=zip(*filter(lambda (x,y): x!=0 or y!=0, zip(p,q))) #去掉二者都是0的概率值 M = [0.5*(_p+_q) for _p,_q in zip(p,q)] p=p+np.spacing(1) q=q+np.spacing(1) M=M+np.spacing(1)# print p,q,M return 0.5*KLD(p,M)+0.5*KLD(q,M)reg=lambda x:[x.count(i) for i in string.lowercase] #频数分布rate=lambda y:[round(i*1.0/sum(reg(y)),4) for i in reg(y)] #概率分布s1='ahaebssa's2='awohwsess'print JSD_core(rate(s1),rate(s2))
0 0
- python实现:KL距离、jensen-shannon距离
- KL距离
- KL距离
- KL距离
- KL距离
- KL距离
- KL距离
- KL距离
- KL距离
- KL距离
- KL散度=KL距离
- KL距离 相对熵
- 【转】KL距离
- KL距离(相对熵)
- (转载)KL距离
- Jensen-Shannon散度
- 相对熵(KL距离)的java实现
- python:距离实现综述
- 配置log4j
- Caffe学习笔记(1)-MNIST数据集的准备
- AJAX学习(1)测试服务器连接+模拟加载视频测试+注册用户名判断
- [LeetCode]--303. Range Sum Query - Immutable
- Halcon11与VS2010联合开发
- python实现:KL距离、jensen-shannon距离
- leetcode_387. First Unique Character in a String 找第一个非重复的字符下标,python字典的应用
- struts2中文乱码解决方法
- java容器 -- java.lang.UnsupportedOperationException
- 社会工程学(安全牛)
- 实现一个简单的类加载器
- STL中的二分查找——lower_bound 、upper_bound 、binary_search
- Storm/JStorm之Topology提交过程
- MQTT协议之使用Future模式订阅及发布(使用fusesource mqtt-client实现)