python-2.7 - 使用 numpy 计算文本文档之间的 Kullback-Leibler (KL) 距离

标签 python-2.7 numpy distance

我的目标是计算以下文本文档之间的 KL 距离:

1)The boy is having a lad relationship
2)The boy is having a boy relationship
3)It is a lovely day in NY

我首先对文档进行矢量化,以便轻松应用 numpy

1)[1,1,1,1,1,1,1]
2)[1,2,1,1,1,2,1]
3)[1,1,1,1,1,1,1]

然后我应用以下代码来计算文本之间的 KL 距离:

import numpy as np
import math
from math import log

v=[[1,1,1,1,1,1,1],[1,2,1,1,1,2,1],[1,1,1,1,1,1,1]]
c=v[0]
def kl(p, q):
    p = np.asarray(p, dtype=np.float)
    q = np.asarray(q, dtype=np.float)
    return np.sum(np.where(p != 0,(p-q) * np.log10(p / q), 0))
for x in v:
    KL=kl(x,c)
    print KL

以下是上述代码的结果:[0.0, 0.602059991328, 0.0]。 文本 1 和 3 完全不同,但它们之间的距离为 0,而高度相关的文本 1 和 2 的距离为 0.602059991328。这不准确。

有人知道我在吉隆坡方面做得不对吗?非常感谢您的建议。

最佳答案

虽然我不想添加另一个答案,但这里有两点。首先,正如 Jaime 在评论中指出的那样,KL 散度(或距离 - 根据以下文档,它们是相同的)旨在衡量概率分布之间的差异。这基本上意味着您传递给函数的内容应该是两个类数组,每个数组的元素之和为 1。

其次,scipy 显然确实实现了这一点,其命名方案与信息论领域更相关。函数是“熵”:

scipy.stats.entropy(pk, qk=None, base=None)

http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.entropy.html

来自文档:

If qk is not None, then compute a relative entropy (also known as Kullback-Leibler divergence or Kullback-Leibler distance) S = sum(pk * log(pk / qk), axis=0).

此函数的好处还在于,如果您传递给它的向量之和不等于 1,它将对它们进行归一化(尽管这意味着您必须小心传递的数组 - 即它们是如何从数据构造的) )。

希望这有帮助,至少有一个库提供了它,这样您就不必自己编写代码。

关于python-2.7 - 使用 numpy 计算文本文档之间的 Kullback-Leibler (KL) 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18380037/

相关文章:

python - 在 numpy 中,将两个结构化矩阵简洁地相乘

python - 从数组中提取元素时出错。 Python

python - 2 条轨迹的 Fréchet 距离

python - 为什么输出不同?

python - 为什么在使用 input() 时会出现 NameError?

python - Python 中二维图像的非均匀采样

java - 使用 Joda Time 获取平均时间

c++ - istream_iterators 之间的距离

python - 这个Python概念叫什么?使用仅限子属性的父类。

python - 跳过行,csv.DictReader