當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。