Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连续PDF的KL发散_Python_Scipy_Statsmodels_Pymc - Fatal编程技术网

Python 连续PDF的KL发散

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

假设我有两个PDF,例如:

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)