我还有一个问题,我希望有人能帮我。
我用Jensen-Shannon散度来度量两个概率分布之间的相似性。相似性得分似乎是正确的,因为它们介于1和0之间,假设一个人使用的是以2为底的对数,0表示分布是相等的。
然而,我不确定某个地方是否真的有错误,我想知道是否有人能说“是的,这是正确的”或“不,你做错了什么”。
代码如下:
from numpy import zeros, array
from math import sqrt, log
class JSD(object):
def __init__(self):
self.log2 = log(2)
def KL_divergence(self, p, q):
""" Compute KL divergence of two vectors, K(p || q)."""
return sum(p[x] * log((p[x]) / (q[x])) for x in range(len(p)) if p[x] != 0.0 or p[x] != 0)
def Jensen_Shannon_divergence(self, p, q):
""" Returns the Jensen-Shannon divergence. """
self.JSD = 0.0
weight = 0.5
average = zeros(len(p)) #Average
for x in range(len(p)):
average[x] = weight * p[x] + (1 - weight) * q[x]
self.JSD = (weight * self.KL_divergence(array(p), average)) + ((1 - weight) * self.KL_divergence(array(q), average))
return 1-(self.JSD/sqrt(2 * self.log2))
if __name__ == '__main__':
J = JSD()
p = [1.0/10, 9.0/10, 0]
q = [0, 1.0/10, 9.0/10]
print J.Jensen_Shannon_divergence(p, q)
问题是我觉得在比较两个文本文档时分数不够高。然而,这纯粹是一种主观感觉。
一如既往,任何帮助都是值得感激的。
python中n个概率分布的通用版本
注意下面的scipy熵调用是Kullback-Leibler散度。
见:http://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence
还要注意问题中的测试用例看起来是错误的??p分布的和不等于1.0。
见:http://www.itl.nist.gov/div898/handbook/eda/section3/eda361.htm
获取一些已知散度分布的数据,并将结果与已知值进行比较。
顺便说一下:KL_散度的和可以用zip built-in function重写,如下所示:
这样可以消除很多“噪音”,而且更像是“Python”。不需要与
0.0
和0
进行双重比较。相关问题 更多 >
编程相关推荐