Python 连续PDF的KL发散
假设我有两个PDF,例如:Python 连续PDF的KL发散,python,scipy,statsmodels,pymc,Python,Scipy,Statsmodels,Pymc,假设我有两个PDF,例如: from scipy import stats pdf_y = stats.beta(5, 9).pdf pdf_x = stats.beta(9, 5).pdf 我想计算他们的。在我重新发明轮子之前,PyData生态系统中是否有任何内置组件可以执行此操作?看起来程序包nimfa具备您所需要的功能 这并不完全是您想要的,因为它似乎只需要一个输入,但它可能是一个开始 此外,此链接可能很有用。似乎有一些代码(不使用numpy)来计算相同的东西。 KL散度在scipy.s
from scipy import stats
pdf_y = stats.beta(5, 9).pdf
pdf_x = stats.beta(9, 5).pdf
我想计算他们的。在我重新发明轮子之前,PyData生态系统中是否有任何内置组件可以执行此操作?看起来程序包
nimfa
具备您所需要的功能
这并不完全是您想要的,因为它似乎只需要一个输入,但它可能是一个开始
此外,此链接可能很有用。似乎有一些代码(不使用numpy)来计算相同的东西。
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)``.
由于KL散度被定义为,我恐怕你必须在(超)空间上对这两个分布进行计算
在您的情况下,这意味着在区间[0,1]内均匀地绘制随机数,并计算两个PDF值,以用于积分计算。在其他答案中,有经验KL散度计算,而我们可以有一个关于β分布的闭式解 我在网上找不到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)
你在哪里找到的?我无法在我熟悉的源代码的基础上运行该函数。现在有一个问题需要添加到文档中。一定是疏忽了。但根据文档,这不适用于连续分发。你能用什么?缺少贬低这个答案的要点。不能将stats.entropy用于beta分布,因为我们处理的是连续情况。如果我们知道使用的是什么分布,可能会有一个封闭形式的解决方案。对于有问题的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)