You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:检验数据是否服从泊松/指数分布及误差分析、参数估计

针对指数/泊松分布拟合的参数估计与误差评估方案

没问题,我来一步步帮你搞定这个需求——先给你讲清楚怎么估计分布参数,再教你怎么量化拟合的误差,都是能直接用到数据上的实战方法,不用绕弯子。

首先得明确个前提:你的数据是0附近的连续概率度量值,极少接近1。这里得先区分泊松和指数分布的适用场景:泊松是离散型分布,专门用来描述计数类数据(比如某时间段内事件发生的次数);而指数是连续型分布,适合描述非负连续变量(比如事件发生的间隔时间)。如果你的数据是连续的,优先考虑指数分布;要是已经转成了离散计数,再用泊松。

一、参数估计方法

1. 指数分布参数估计

指数分布的概率密度函数是 f(x; λ) = λe^(-λx),其中λ是率参数(λ>0)。不管用矩估计还是极大似然估计(MLE),结果都是一样的:λ的估计值就是样本均值的倒数。

用Python直接实现的话,代码很简单:

import numpy as np
from scipy.stats import expon

# 把你的真实数据替换这里的示例数据
data = np.array([0.02, 0.1, 0.05, 0.08, 0.15])

# 手动计算:矩估计/MLE
lambda_hat = 1 / np.mean(data)
print(f"指数分布率参数λ的估计值: {lambda_hat:.4f}")

# 用scipy的fit方法直接拟合(更省心)
loc, scale = expon.fit(data, floc=0)  # 指数分布通常固定loc=0
lambda_hat_scipy = 1 / scale
print(f"scipy拟合的λ估计值: {lambda_hat_scipy:.4f}")

2. 泊松分布参数估计

泊松分布的概率质量函数是 P(X=k; λ) = (e^(-λ)λ^k)/k!,λ既是均值也是方差。它的参数估计更简单,直接用样本均值就行,矩估计和MLE结果一致。

注意:泊松只适用于非负整数数据,如果你的原始数据是连续的概率值,得先把它离散化(比如乘以100转成整数计数)。代码示例:

from scipy.stats import poisson

# 示例离散计数数据,替换成你的离散化后的数据
discrete_data = np.array([0, 1, 0, 2, 1])

# 手动计算参数
lambda_hat_poisson = np.mean(discrete_data)
print(f"泊松分布参数λ的估计值: {lambda_hat_poisson:.4f}")

# scipy拟合验证
lambda_hat_poisson_scipy = poisson.fit(discrete_data)[0]
print(f"scipy拟合的泊松λ估计值: {lambda_hat_poisson_scipy:.4f}")

二、拟合误差与优度评估

光有参数还不够,得知道这个拟合到底准不准。这里给你三种评估方式:统计检验、可视化、数值误差指标,全方位判断。

1. 统计检验:用p值判断拟合显著性

  • KS检验(针对指数分布):比较你的数据的经验分布和理论指数分布的差异,p值越大,说明拟合得越好。一般p>0.05的话,就不能拒绝“数据服从指数分布”的假设。
from scipy.stats import kstest

stat, p_val = kstest(data, 'expon', args=(0, scale))
print(f"指数分布KS检验统计量: {stat:.4f}, p值: {p_val:.4f}")
  • 卡方拟合优度检验(针对泊松分布):需要把数据分组,比较观测频数和理论频数的差异。注意要合并理论频数小于5的组,不然检验结果不准。
from scipy.stats import chisquare

# 先分组计算观测频数
bins = np.arange(0, max(discrete_data)+2)
observed, _ = np.histogram(discrete_data, bins=bins)

# 计算理论频数
lambda_hat = lambda_hat_poisson
theoretical = len(discrete_data) * poisson.pmf(bins[:-1], lambda_hat)

# 合并小频数组
combined_observed = []
combined_theoretical = []
for obs, theo in zip(observed, theoretical):
    if not combined_observed or combined_theoretical[-1] + theo < 5:
        if combined_observed:
            combined_observed[-1] += obs
            combined_theoretical[-1] += theo
        else:
            combined_observed.append(obs)
            combined_theoretical.append(theo)
    else:
        combined_observed.append(obs)
        combined_theoretical.append(theo)

stat_chisq, p_val_chisq = chisquare(combined_observed, f_exp=combined_theoretical)
print(f"泊松分布卡方检验统计量: {stat_chisq:.4f}, p值: {p_val_chisq:.4f}")

2. 可视化:直观看拟合效果

用直方图加上拟合的分布曲线,一眼就能看出拟合得好不好:

import matplotlib.pyplot as plt

# 指数分布拟合可视化
plt.hist(data, bins='auto', density=True, alpha=0.6, label='观测数据')
x = np.linspace(0, max(data), 1000)
pdf = expon.pdf(x, loc=0, scale=scale)
plt.plot(x, pdf, 'r-', lw=2, label=f'指数分布拟合 (λ={lambda_hat:.4f})')
plt.xlabel('概率度量值')
plt.ylabel('密度')
plt.legend()
plt.title('指数分布拟合效果')
plt.show()

# 泊松分布拟合可视化
plt.hist(discrete_data, bins=bins, align='left', density=True, alpha=0.6, label='观测数据')
x_poisson = bins[:-1]
pmf = poisson.pmf(x_poisson, lambda_hat_poisson)
plt.plot(x_poisson, pmf, 'ro-', lw=2, label=f'泊松分布拟合 (λ={lambda_hat_poisson:.4f})')
plt.xlabel('离散计数值')
plt.ylabel('概率')
plt.legend()
plt.title('泊松分布拟合效果')
plt.show()

3. 数值误差指标:量化拟合差异

对于连续的指数分布拟合,还可以用这些指标量化误差:

  • 均方误差(MSE):对比数据的核密度估计(KDE)和拟合的PDF之间的差异,值越小越好。
from scipy.stats import gaussian_kde

kde = gaussian_kde(data)
mse = np.mean((kde(x) - pdf)**2)
print(f"指数分布拟合MSE: {mse:.6f}")
  • 对数似然值:值越大,说明拟合的分布越贴合数据。
log_likelihood = np.sum(expon.logpdf(data, loc=0, scale=scale))
print(f"指数分布拟合对数似然值: {log_likelihood:.4f}")

三、额外提醒

最后给你个小建议:如果你的数据是0-1之间的连续值,且集中在0附近,除了指数分布,还可以试试Beta分布——它专门针对0-1区间的连续变量,当参数α很小、β很大时,分布会紧紧集中在0附近,可能比指数分布更贴合你的数据特征。另外,如果数据里有大量0值,普通指数分布可能不够用,得考虑零膨胀指数分布。

内容的提问来源于stack exchange,提问作者FrancoFranchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:37:54