【发布时间】:2021-04-14 20:28:25
【问题描述】:
scipy.stats 中的每个连续分布都带有一个计算其微分熵的属性:.entropy。与正态分布 (norm) 和其他具有熵的封闭形式解的其他分布不同,其他分布必须依赖于数值积分。
试图找出在这些情况下.entropy 属性调用的是哪个函数,我在scipy.stats._distn_infrastructure.py 中找到了一个名为_entropy 的函数,它与integrate.quad(pdf) 一起使用(数值积分)。
但是当我尝试比较这两种方法时(属性.entropy 与函数_entropy 的数值积分),函数给出错误:
AttributeError: 'rv_frozen' object has no attribute '_pdf'
为什么分布的属性.entropy计算正常,而函数_entropy却报错?
import numpy as np
from scipy import integrate
from scipy.stats import norm, johnsonsu
from scipy.special import entr
def _entropy(self, *args): #from _distn_infrastructure.py
def integ(x):
val = self._pdf(x, *args)
return entr(val)
# upper limit is often inf, so suppress warnings when integrating
# _a, _b = self._get_support(*args)
_a, _b = -np.inf, np.inf
with np.errstate(over='ignore'):
h = integrate.quad(integ, _a, _b)[0]
if not np.isnan(h):
return h
else:
# try with different limits if integration problems
low, upp = self.ppf([1e-10, 1. - 1e-10], *args)
if np.isinf(_b):
upper = upp
else:
upper = _b
if np.isinf(_a):
lower = low
else:
lower = _a
return integrate.quad(integ, lower, upper)[0]
使用该属性可以正常工作:
print(johnsonsu(a=2.55,b=2.55).entropy())
返回0.9503703091220894
但函数没有:
print(_entropy(johnsonsu(a=2.55,b=2.55)))
返回错误 AttributeError: 'rv_frozen' object has no attribute '_pdf',即使johnsonsu does have this attribute:
def _pdf(self, x, a, b):
# johnsonsu.pdf(x, a, b) = b / sqrt(x**2 + 1) *
# phi(a + b * log(x + sqrt(x**2 + 1)))
x2 = x*x
trm = _norm_pdf(a + b * np.log(x + np.sqrt(x2+1)))
return b*1.0/np.sqrt(x2+1.0)*trm
在johnsonsu的情况下,属性.entropy调用的是哪个函数?
【问题讨论】:
标签: python entropy information-theory probability-distribution scipy.stats