说我有两个pdf,例如:
from scipy import stats
pdf_y = stats.beta(5, 9).pdf
pdf_x = stats.beta(9, 5).pdf
我想计算他们的KL divergence。在重新发明轮子之前,PyData生态系统中是否有内置工具用于此?
答案 0 :(得分:4)
KL分歧可在scipy.stats.entropy中找到。来自docstring
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)``.
答案 1 :(得分:2)
由于KL-divergence被定义为integral for the continuous case我害怕你必须在两个发行版的(超)空间上做Monte Carlo integration。
在您的情况下,这意味着在区间[0,1]中均匀地绘制随机数并计算两个PDF值,以便在积分计算中使用。
答案 2 :(得分: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 :(得分:1)
在其他答案中,存在经验性KL散度计算,而我们可以针对问题的Beta分布提供封闭形式的解决方案。
我无法在网络上找到有关KL-div的Beta发行摘要。最后,我自己编写了代码。
共享它可能对其他人有用:
import numpy as np
from scipy import special
def kl(a1, b1, a2, b2):
"""https://en.wikipedia.org/wiki/Beta_distribution"""
B = special.beta
DG = special.digamma
return np.log(B(a2, b2) / B(a1, b1)) + (a1 - a2) * DG(a1) + (b1 - b2) * DG(b1) + (
a2 - a1 + b2 - b1) * DG(a1 + b1)