【发布时间】:2013-03-30 14:18:06
【问题描述】:
我还有一个问题希望有人能帮助我。
我正在使用 Jensen-Shannon-Divergence 来衡量两个概率分布之间的相似性。考虑到使用以 2 为底的对数,相似度得分在 1 和 0 之间似乎是正确的,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)
问题是,例如比较两个文本文档时,我觉得分数不够高。不过,这纯属主观感受。
一如既往地感谢任何帮助。
【问题讨论】:
-
也许可以尝试将输出与this Matlab script? 进行比较,或者在 Octave 中运行。
-
if p[x] != 0.0 or p[x] != 0看起来很奇怪。 -
如果 p[x] != 0.0 或 p[x] != 0 用于确保我们不考虑为零的条目,无论它们是浮点数还是整数,是什么你指的是什么?或者你的意思是这条线是奇怪的句号?非常感谢。
-
p[x] != 0相同,因为0.0 == 0。这就是为什么我怀疑那里可能有错字。