Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 使用scipy.stats中的integrate.quad计算微分熵?_Python_Entropy_Continuous_Information Theory_Scipy.stats - Fatal编程技术网

Python 使用scipy.stats中的integrate.quad计算微分熵?

Python 使用scipy.stats中的integrate.quad计算微分熵?,python,entropy,continuous,information-theory,scipy.stats,Python,Entropy,Continuous,Information Theory,Scipy.stats,scipy.stats.entropy计算连续随机变量的微分熵。究竟是用哪种估计方法,哪种公式计算微分熵?(即norm分布与beta分布的差分熵) 下面是它的github代码。微分熵是p.d.f.乘以对数p.d.f.的负整数和,但我看不到这一点,也看不到写的对数。它是否会出现在对integrate.quad的调用中 def _entropy(self, *args): def integ(x): val = self._pdf(x, *args) retu

scipy.stats.entropy
计算连续随机变量的微分熵。究竟是用哪种估计方法,哪种公式计算微分熵?(即
norm
分布与
beta
分布的差分熵)

下面是它的github代码。微分熵是p.d.f.乘以对数p.d.f.的负整数和,但我看不到这一点,也看不到写的对数。它是否会出现在对
integrate.quad
的调用中

def _entropy(self, *args):
    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)
    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]

Source(第2501-2524行):

这里的实际问题是如何在内存中存储连续变量。您可以使用一些离散化技术并计算离散随机变量的熵


您还可以检查,它基本上将分布视为张量,并为
分布
类提供了一种方法
熵()

除非使用近似值,否则您必须以某种参数化方式存储连续随机变量。在这种情况下,您通常使用分布对象;对于已知的分布,存在用参数表示的微分熵公式

因此,Scipy提供了一个for
rv_continuous
,在可能的情况下计算微分熵:

In [5]: import scipy.stats as st                                                                                                                             

In [6]: rv = st.beta(0.5, 0.5)                                                                                                                               

In [7]: rv.entropy()                                                                                                                                         
Out[7]: array(-0.24156448)

rv_continuous.entropy仅返回True或False,而不是差分熵的值。这是什么意思?什么?这不是它应该做的,明白吗。你确定调用正确吗?即使链接中的示例也显示了一个布尔返回输出:>>>drv=rv_离散(值=((0,1),(0.5,0.5))>>>np.allclose(drv.entropy(),np.log(2.0))是的,当然。由于调用了
np.allclose
。这表明,
entropy
的结果大约等于
log(2)
,这是一个无理数。那么你说的是rv_continuous。通常情况下,熵应该为输出返回实数,而不是布尔数?请给出一个没有np.allclose的例子,说明你的意思是使用scipy.stats.rv_离散化连续随机变量数组吗?对于T型向量/时间序列,这是如何实现的?文档仅显示统一二进制变量的示例