如何使用 SciPy 找到经验数据集的最佳拟合理论分布并计算超过给定阈值的概率?

DDD
发布: 2024-11-24 11:36:09
原创
466 人浏览过

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板