gpt4 book ai didi

python - 詹森-香农散度

转载 作者:太空狗 更新时间:2023-10-29 17:12:01 25 4
gpt4 key购买 nike

我还有一个问题,希望有人能帮助我。

我正在使用 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)

问题是,我觉得比较两个文本文档时,分数不够高。然而,这纯粹是一种主观感受。

我们一如既往地感谢您的帮助。

最佳答案

请注意,下面的 scipy 熵调用是 Kullback-Leibler 散度。

参见:http://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence

#!/usr/bin/env python
from scipy.stats import entropy
from numpy.linalg import norm
import numpy as np

def JSD(P, Q):
_P = P / norm(P, ord=1)
_Q = Q / norm(Q, ord=1)
_M = 0.5 * (_P + _Q)
return 0.5 * (entropy(_P, _M) + entropy(_Q, _M))

另请注意,问题中的测试用例看起来有误?? p 分布的总和不等于 1.0。

参见:http://www.itl.nist.gov/div898/handbook/eda/section3/eda361.htm

关于python - 詹森-香农散度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com