scipy 中的 t 分布熵:如何为 digamma 和 beta 函数输入自由度?

Entropy of t-distribution in scipy: How to input degrees of freedom to digamma and beta functions?

服从 t 分布的变量 X 的熵的封闭形式解析解,导出 here,是

看到python有函数scipy.special.digammascipy.special.beta,请问上面的公式如何用代码实现呢?

令我困惑的是,刚才提到的函数并没有根据documentation以自由度参数nu(v)作为输入。 运行 示例会有所帮助

根据其定义,Shanoon 将熵定义为:

现在,如果您将此公式应用于 Student-t 分布,您会注意到该分布已经包含自由度参数 (v):

作为集成的结果,您将在近似值中同时拥有 Betta 和 Digmma。如果你会计算,老实说我不会,你会发现这些以v作为输入只是计算的结果.这不在他们的定义中。

v 在 1(柯西分布)和 无穷大(正态分布)之间变化。

为了简化计算,我使用了以下代码:

import numpy as np
import scipy.special as sc
v = float(input('Degre of freedom '))
v1 = (1+v)/2
v2 = v/2
Entropy_of_Variable_X = v1*(sc.digamma(v1)-sc.digamma(v2))+np.log(np.sqrt(v)*sc.beta(v2,0.5))
print('Entropy of the variable X, of degree of freedom equal to : ', v, 'is ', Entropy_of_Variable_X)

你可以传递一个列表或类似的东西来计算多重分布的熵。

您还可以使用多元学生 t 分布的微分熵,其中 dim 是量纲,dof 是自由度,cmtx 是协方差。

import numpy as np
import scipy.special as sc
def compute_true_entropy(dim=1, dof=3, std=False):
    cmtx = np.identity(dim)
    B0 = 0.5*np.log(np.linalg.det(cmtx))
    B1 = sc.gamma((dim+dof)/2)/((sc.gamma(dof/2))*((np.pi*dof)**(dim/2)))
    B2 = ((dof+dim)/2)*(sc.digamma((dof+dim)/2) - sc.digamma((dof)/2))
    entropy = B0 - np.log(B1) + B2
   return entropy