连续概率密度函数的KL散度
假设我有两个PDF文件,比如:
from scipy import stats
pdf_y = stats.beta(5, 9).pdf
pdf_x = stats.beta(9, 5).pdf
我想计算它们的KL散度。在我重新发明轮子之前,PyData生态系统中有没有现成的工具可以做到这一点?
4 个回答
1
看起来这个叫做 nimfa
的包正好符合你的需求。你可以在这里找到它:http://nimfa.biolab.si
V = np.matrix([[1,2,3],[4,5,6],[6,7,8]])
fctr = nimfa.mf(V, method = "lsnmf", max_iter = 10, rank = 3)
fctr_res = nimfa.mf_run(fctr)
# Print the loss function according to Kullback-Leibler divergence. By default Euclidean metric is used.
print "Distance Kullback-Leibler: %5.3e" % fctr_res.distance(metric = "kl")
不过,这个包可能不是完全符合你的要求,因为它似乎只接受一个输入,但可以作为一个起点。
另外,这个链接也可能对你有帮助。里面有一些代码(不是用numpy的)可以计算同样的东西。你可以查看这里:https://code.google.com/p/tackbp2011/source/browse/TAC-KBP2011/src/python-utils/LDA/kullback-leibler-divergence.py?r=100
3
KL散度可以在scipy.stats.entropy这个库里找到。下面是文档中的说明:
stats.entropy(pk, qk=None, base=None)
Calculate the entropy of a distribution for given probability values.
If only probabilities `pk` are given, the entropy is calculated as
``S = -sum(pk * log(pk), axis=0)``.
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)``.