当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.differential_entropy用法及代码示例


本文简要介绍 python 语言中 scipy.stats.differential_entropy 的用法。

用法:

scipy.stats.differential_entropy(values, *, window_length=None, base=None, axis=0, method='auto')#

给定一个分布样本,估计微分熵。

使用方法参数可以使用几种估计方法。默认情况下,根据样本大小选择方法。

参数

values 序列

来自连续分布的样本。

window_length 整数,可选

用于计算 Vasicek 估计的窗口长度。必须是介于 1 和样本大小一半之间的整数。如果None(默认),它使用启发式值

其中 是样本大小。这种启发式方法最初是在 [2] 中提出的,并且在文献中很常见。

base 浮点数,可选

要使用的对数底数,默认为e(自然对数)。

axis 整数,可选

计算微分熵的轴。默认值为 0。

method {‘vasicek’,'van es',‘ebrahimi’, ‘correa’, ‘auto’},可选

用于从样本中估计微分熵的方法。默认为 'auto' 。有关详细信息,请参阅注释。

返回

entropy 浮点数

计算出的微分熵。

注意

该函数将收敛到极限内的真实微分熵

对于给定样本大小,window_length 的最佳选择取决于(未知)分布。通常,分布密度越平滑,window_length 的最佳值就越大[1]。

以下选项可用于方法参数。

  • 'vasicek' 使用 [1] 中提供的估计器。这是微分熵的第一个也是最有影响的估计量之一。

  • 'van es' 使用 [3] 中提出的偏差校正估计量,它不仅是一致的,而且在某些条件下是渐近正态的。

  • 'ebrahimi' 使用 [4] 中提出的估计器,在仿真中显示该估计器比 Vasicek 估计器具有更小的偏差和均方误差。

  • 'correa' 使用 [5] 中基于局部线性回归的估计器。在模拟研究中,它的均方误差始终小于 Vasiceck 估计器,但计算成本更高。

  • 'auto' 自动选择方法(默认)。目前,对于非常小的样本 (<10) 选择 'van es',对于中等样本大小 (11-1000) 选择 'ebrahimi',对于较大的样本选择 'vasicek',但此行为在未来版本中可能会发生变化。

所有估计器都按照 [6] 中的说明实现。

参考

[1] (1,2)

瓦西切克,O. (1976)。基于样本熵的正态性检验。皇家统计学会杂志:B 系列(方法论),38(1),54-59。

[2]

Crzcgorzewski, P. 和 Wirczorkowski, R. (1999)。基于熵的goodness-of-fit index 测试。 Statistics-Theory 和方法中的通信,28(5),1183-1202。

[3]

Van Es, B. (1992)。通过基于间距的一类统计来估计与密度相关的泛函。斯堪的纳维亚统计杂志,61-72。

[4]

Ebrahimi, N.、Pflughoeft, K. 和 Soofi, E. S. (1994)。样本熵的两种度量。统计与概率快报,20(3),225-234。

[5]

Correa, J. C. (1995)。一种新的熵估计量。 Statistics-Theory 和方法中的通信,24(10), 2439-2449。

[6]

Noughabi, H. A. (2015)。使用数值方法进行熵估计。数据科学年鉴,2(2),231-241。https://link.springer.com/article/10.1007/s40745-015-0045-9

例子

>>> import numpy as np
>>> from scipy.stats import differential_entropy, norm

标准正态分布的熵:

>>> rng = np.random.default_rng()
>>> values = rng.standard_normal(100)
>>> differential_entropy(values)
1.3407817436640392

与真实熵比较:

>>> float(norm.entropy())
1.4189385332046727

对于 5 到 1000 之间的几个样本大小,比较 'vasicek''van es''ebrahimi' 方法的准确性。具体来说,比较估计值和分布的真实微分熵之间的均方根误差(超过 1000 次试验)。

>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>>
>>>
>>> def rmse(res, expected):
...     '''Root mean squared error'''
...     return np.sqrt(np.mean((res - expected)**2))
>>>
>>>
>>> a, b = np.log10(5), np.log10(1000)
>>> ns = np.round(np.logspace(a, b, 10)).astype(int)
>>> reps = 1000  # number of repetitions for each sample size
>>> expected = stats.expon.entropy()
>>>
>>> method_errors = {'vasicek': [], 'van es': [], 'ebrahimi': []}
>>> for method in method_errors:
...     for n in ns:
...        rvs = stats.expon.rvs(size=(reps, n), random_state=rng)
...        res = stats.differential_entropy(rvs, method=method, axis=-1)
...        error = rmse(res, expected)
...        method_errors[method].append(error)
>>>
>>> for method, errors in method_errors.items():
...     plt.loglog(ns, errors, label=method)
>>>
>>> plt.legend()
>>> plt.xlabel('sample size')
>>> plt.ylabel('RMSE (1000 trials)')
>>> plt.title('Entropy Estimator Error (Exponential Distribution)')
scipy-stats-differential_entropy-1.png

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.differential_entropy。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。