我有两个矩阵X和Y(在我的大多数情况下它们是相似的)现在我想计算所有行之间的成对KL分歧并将它们输出到矩阵中。 E.g:
X = [[0.1, 0.9], [0.8, 0.2]]
然后该函数应该取kl_divergence(X, X)
并计算两个X矩阵的每对行的成对K1发散距离。输出将是2x2矩阵。
在Python中已经有了一些实现吗?如果没有,这应该很容易计算。我想要一些矩阵实现,因为我有很多数据,需要尽可能地保持运行时间。或者,Jensen-Shannon熵也很好。最终这对我来说甚至是更好的解决方案。
答案 0 :(得分:14)
注意KL divergence本质上是P(i)和log(P(i)/ Q(i))的点积。因此,一个选项是为P(i)形成numpy数组列表,为log(P(i)/ Q(i))形成另一个数组,每个KL分歧要计算一行,然后执行dot-products。
答案 1 :(得分:2)
有一个名为dit的新(ish)库,它实现了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
文档可以使用一些工作,但看起来很有希望。