直方图拟合PDF缩放问题:Gamma分布拟合曲线幅值远低于直方图
问题分析与解决方案
你遇到的核心问题是直方图和拟合PDF的归一化逻辑不匹配,导致两者的幅值差距很大。咱们来拆解一下问题出在哪,以及怎么修正:
为什么会出现幅值差异?
- 你的直方图用了
weights = np.ones_like(data)/len(data)且未设置density=True,这会让直方图的每个bin高度代表该区间的样本占比(所有bin高度之和为1,属于概率质量的展示)。 - 而你对拟合的PDF做了
pdf_fit/sum(pdf_fit)的操作——这完全搞错了连续概率分布PDF的归一化逻辑:连续PDF的本质是积分和为1,不是离散点的求和为1。直接除以sum(pdf_fit)会把PDF的幅值大幅压缩,自然远低于直方图。
修正后的代码
只需要把直方图切换到概率密度模式,同时去掉PDF的错误归一化操作即可:
import numpy as np import matplotlib.pyplot as plt from scipy import stats # 你的时间序列数据 data = contents[0][1:] # 绘制概率密度直方图(density=True 表示高度为概率密度,积分和为1) plt.hist(data, bins=20, color='w', edgecolor='black', alpha=0.5, density=True) # 拟合Gamma分布并绘制正确归一化的PDF dist = stats.gamma param = dist.fit(data) x = np.linspace(min(data), max(data), 100) # scipy的pdf方法已经返回归一化到积分1的概率密度值,无需额外处理 pdf_fit = dist.pdf(x, *param[:-2], loc=param[-2], scale=param[-1]) plt.plot(x, pdf_fit, label='Gamma') plt.legend(loc='upper right') plt.show()
额外说明
如果你非要用概率质量的方式展示(不推荐,因为连续分布用概率密度更符合统计意义),那需要计算每个直方图bin内PDF的积分值,再用柱状图展示,但这样步骤更繁琐。上面的修正方案是最简洁且符合统计规范的做法。
内容的提问来源于stack exchange,提问作者Yujian
相关产品推荐
相关产品推荐

