Scipy.stats.entropy 给出了与熵公式不同的结果

Mub*_*aka 1 python numpy scipy

我正在尝试计算概率分布的信息熵,但我得到了 2 个不同的答案,但我不知道为什么或哪个是正确的。

  1. 我尝试使用 scipy.stats.entropy。
  2. 然后我查看了 scipy.stats.entropy 的源代码,就像在源代码中一样,我使用 scipy.special.entr 计算了熵,并得到了不同的答案。
  3. 然后我纯粹使用 scipy.stats.entropy 页面上给出的公式计算熵,并得到与 2 相同的答案。
import numpy as np
from scipy.special import entr
from scipy.stats import entropy
np.random.seed(123)

data = np.random.rand(5)

e = entropy(data,base=2)          #this one is different, why?
f = np.sum(entr(data))/np.log(2)
g = -np.sum(data*np.log2(data))
Run Code Online (Sandbox Code Playgroud)

知道错误在哪里吗?

War*_*ser 6

entropy自动对输入进行归一化,使概率向量之和为 1。您对f和的计算结果g并非如此。

如果你标准化data,例如,

data = np.random.rand(5)
data /= data.sum()
Run Code Online (Sandbox Code Playgroud)

结果将一致:

In [35]: data = np.random.rand(5)                                                            

In [36]: data /= data.sum()                                                                  

In [37]: entropy(data, base=2)                                                               
Out[37]: 2.2295987226926375

In [38]: np.sum(entr(data))/np.log(2)                                                        
Out[38]: 2.2295987226926375

In [39]: -np.sum(data*np.log2(data))                                                         
Out[39]: 2.2295987226926375
Run Code Online (Sandbox Code Playgroud)