python psi_换个角度理解PSI(2)——从KL散度到PSI的奇幻之旅
相对熵
上次我们讲到IV和PSI的公式可以用一个通用表达式表示:
并且用熵的概念简要的说明了为什么对数项可以表明信息量的大小。 对于通用公式的后半部分,没有展开来讲,今天我们这里入手,其实:
对后一项进行变换
从这部分入手,有一种更好的解释,熟悉熵家族的同学可能已经看出来了,每一项其实都是相对熵(也被称为KL散度),PSI其实是
和
分布互相的相对熵之和。
非对称度量指标:KL散度
KL散度又称相对熵、信息散度。KL散度主要是用来衡量两个概率分布之间的差异。
假设
和
是关于
的两个概率分布,则
对
的KL散度为
KL散度具有以下性质KL散度具有非对称性,KL散度尽管被用来度量两个分布的相似度或者说距离,但是KL散度本身不是距离。
KL散度同样不满足三角不等式
KL散度具有非负性,因为对数函数是凸函数,所以KL散度的值为非负数。
这里简单明确下,本质上,KL散度度量的是两者之间的信息损失,而不是两者之间的距离。
距离的定义,在传统的教材里面距离度量的定义就是需要满足四个条件:非负性,对称性,同一性 ,和三角不等式,这样的定义主要是从经验出发,而KL散度不满足对称性和三角不等式。
我们知道KL散度和距离度量指标最大的区别在于它是非对称度量,既然是非对称的,这里我们解决一下
和
有什么不一样
(1)首先,公式
涉及了两个分布,其中要传递的信息来自分布:
;信息传递的方式依赖的分布:
;分布
中可能性越大的事件,对
的影响也越大。如果想让
尽可能的小,就要优先关注
事件中的常见事件,并确保它在
事件中也不是特别罕见。因为一旦事件x在
分布罕见,意味着我们没有优化传递x的成本,传递x需要的成本
会很大。当这套传递方式在用来传递
分布时,传递常见事件需要的成本会很大,整体成本也就会很大。
(2)我们记熵
;交叉熵
,我们会发现;
,我们发现第二项
和分布
无关,所以最小化KL散度就是最小化交叉熵;但是反过来,
,两项均和
相关,最小化KL散度为最小化
和
的交叉熵和
的熵的差。
这里理解起来有点绕,但是从公式直观上我们也能看出来,
是不等于
的。
对称度量:JS散度
为了解决KL散度的不对称性(数学家们的强迫症,确实在实际中使用中更加方便,有更好的性质),数学家发明了一种KL变种,JS散度:
取值为0到1之间
对称度量:PSI
同样的,我们看到:
PSI可以看做是解决KL散度非对称性的一个对称性度量指标,用于度量分布之间的差异。
KL散度 python实现
从公式可以发现,P 和 Q 中元素的个数不用相等,只需要两个分布中的离散元素一致。 因此计算不管是计算KL散度还是计算PSI,都需要对变量进行离散化,保证两个分布的离散元素一致。
import numpy as np
import scipy.stats
p=np.asarray([0.65,0.25,0.07,0.03])
q=np.array([0.6,0.25,0.1,0.05])
def KL_divergence(p,q):
return scipy.stats.entropy(p, q)
print(KL_divergence(p,q)) # 0.011735745199107783
print(KL_divergence(q,p)) # 0.013183150978050884
JS散度 python实现
import numpy as np
import scipy.stats
p=np.asarray([0.65,0.25,0.07,0.03])
q=np.array([0.6,0.25,0.1,0.05])
q2=np.array([0.1,0.2,0.3,0.4])
def JS_divergence(p,q):
M=(p+q)/2
return 0.5*scipy.stats.entropy(p, M)+0.5*scipy.stats.entropy(q, M)
print(JS_divergence(p,q)) # 0.003093977084273652
print(JS_divergence(p,q2)) # 0.24719159952098618
print(JS_divergence(p,p)) # 0.0
PSI python实现
这个我们留到下期再讲(还有hive实现psi计算的彩蛋,欢迎持续关注)
参考资料
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
