Python中的Pairwise Kullback Leibler(或Jensen-Shannon)散度距离矩阵

3

我有两个矩阵X和Y(在大多数情况下它们是相似的)。现在我想计算所有行之间的成对KL散度,并将它们输出到矩阵中。例如:

X = [[0.1, 0.9], [0.8, 0.2]]

该函数应该接受kl_divergence(X,X),并计算 X 矩阵的每一行与另一个 X 矩阵的每一行之间的成对 Kl 散度距离。输出将是一个 2x2 的矩阵。
在 Python 中已经有此实现吗?如果没有,这应该很容易计算。我希望有一种矩阵实现,因为我有很多数据,需要尽可能减少运行时间。或者 Jensen-Shannon 熵也可以。最终,这对我来说甚至是更好的解决方案。

1
X的行代表什么?是有限事件集上的概率分布吗? - Fred Foo
是的,确切地说,这些行是概率分布,每一行在分布中具有完全相同数量的元素。 - fsociety
2个回答

14
请注意KL散度本质上是P(i)和log(P(i)/Q(i))的点积。因此,一种选择是为P(i)和log(P(i)/Q(i))分别形成一个numpy数组列表(每个要计算的KL散度都有一行),然后执行点积运算。

2

有一个相对较新的库叫做dit,它实现了JSD,还有互信息和许多其他距离度量:

import dit
foo = dit.Distribution(['A','B','C'],[0.5,0.5,0.0])
bar = dit.Distribution(['A','B','C'],[0.1,0.0,0.9])
dit.divergences.jensen_shannon_divergence([foo,bar])
0.80499327350549388

文档需要改进,但看起来很有前途。 http://docs.dit.io/en/latest/generalinfo.html#quickstart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接