首頁 > 後端開發 > Python教學 > 如何使用 SciPy 找到經驗資料集的最佳擬合理論分佈併計算超過給定閾值的機率?

如何使用 SciPy 找到經驗資料集的最佳擬合理論分佈併計算超過給定閾值的機率?

DDD
發布: 2024-11-24 11:36:09
原創
524 人瀏覽過

How can I use SciPy to find the best-fitting theoretical distribution for an empirical dataset and calculate probabilities exceeding a given threshold?

使用Scipy 將經驗分佈擬合為理論分佈

問題概述

考慮從未知樣本中採樣的整數值資料集連續分佈。我們試圖確定遇到大於任何給定閾值的值的機率(p 值)。為了準確估計這些機率,必須將我們的經驗分佈擬合到適當的理論分佈。本文探討如何在 Python 中使用 Scipy 執行此類擬合。

分佈適合

為了評估適合度,我們可以採用誤差平方和(SSE)指標來比較經驗數據和適合分佈的直方圖。具有最低 SSE 的分佈被認為是最佳擬合。

Scipy 實作

Scipy 的統計模組提供了廣泛的連續分佈類別。我們可以迭代每個分佈,估計其參數,計算 SSE,並儲存結果。

範例:El Niño 資料集

讓我們說明一下該過程使用厄爾尼諾資料集中的海面溫度 (SST) 資料。

  1. 載入資料並繪製其直方圖。
  2. 使用 SSE 指標執行分佈擬合。
  3. 根據最低 SSE 決定最佳擬合分佈。
  4. 繪製機率密度函數 (PDF )的最佳擬合分佈以及經驗直方圖。

下面的程式碼展示了這一點實現:

import numpy as np
import pandas as pd
import scipy.stats as st
import matplotlib.pyplot as plt
from scipy.stats._continuous_distns import _distn_names
import warnings

# El Niño SST data
data = pd.Series(sm.datasets.elnino.load_pandas().data.set_index('YEAR').values.ravel())

# Function to fit distributions based on SSE
def best_fit_distribution(data):
    return sorted(
        [
            (getattr(st, distribution), distribution.fit(data), np.sum(np.power(data.hist(bins=50).values - distribution.pdf(data.index), 2.0))) 
            for distribution in _distn_names 
            if not distribution in ['levy_stable', 'studentized_range']
        ], 
    key=lambda x:x[2]
)

# Find best fit
best_dist = best_fit_distribution(data)[0]

# Plot distribution
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(data.hist(bins=50, density=True, alpha=0.5, color='gray'))
param_names = best_dist[0].shapes + ', loc, scale' if best_dist[0].shapes else ['loc', 'scale']
param_str = ', '.join(['{}={:0.2f}'.format(k, v) for k, v in zip(param_names, best_dist[1])])
dist_str = '{}({})'.format(best_dist[0].name, param_str)

ax.plot(best_dist[0].pdf(data.index, **best_dist[1]), lw=2, label=dist_str)
ax.set_title('Fitted Distribution: ' + dist_str)
ax.set_xlabel('SST (°C)')
ax.set_ylabel('Frequency')
ax.legend()
登入後複製

輸出將最佳擬合分佈顯示為威布爾分佈,參數為:

scale=0.64, loc=15.59
登入後複製

以上是如何使用 SciPy 找到經驗資料集的最佳擬合理論分佈併計算超過給定閾值的機率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板