遵循 t 分布的变量 X 的熵的封闭式解析解,在此处导出,为
看到python有函数scipy.special.digamma
和scipy.special.beta
,上面的公式怎么用代码实现呢?
令我困惑的是,刚才提到的函数并没有根据文档将自由度参数nu (v)作为输入。一个运行的例子会有所帮助
遵循 t 分布的变量 X 的熵的封闭式解析解,在此处导出,为
看到python有函数scipy.special.digamma
和scipy.special.beta
,上面的公式怎么用代码实现呢?
令我困惑的是,刚才提到的函数并没有根据文档将自由度参数nu (v)作为输入。一个运行的例子会有所帮助
您还可以使用多元学生 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
现在,如果将此公式应用于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)
您可以向它传递一个列表或类似的东西来计算多重分布的熵。