如何在scipy.stats中正确绘制Beta分布PDF并验证数据拟合效果
如何正确绘制拟合后的Beta分布PDF?
你当前绘制的Beta分布PDF图像异常,核心原因是直接使用无序的原始数据点计算并绘制PDF,导致折线在无序的x值间随机跳转,无法呈现分布的连续形态。以下是修正方案:
问题代码分析
原代码存在两个关键问题:
- 未导入
numpy却使用了np.array - 用原始无序数据点
x绘制PDF,而非覆盖分布区间的有序序列
修正后的完整代码
import numpy as np import scipy.stats as stats import matplotlib.pyplot as plt # 原始数据 x = np.array([0.9999999 , 0.9602287 , 0.8823198 , 0.83825594, 0.92847216, 0.9632976 , 0.90275735, 0.8383094 , 0.9826664 , 0.9141795 , 0.88799196, 0.9272752 , 0.94456017, 0.90466917, 0.8905505 , 0.95424247, 0.781545 , 0.9489085 , 0.9578988 , 0.8644015 ]) # 拟合Beta分布参数 beta_params = stats.beta.fit(x) alpha, beta, loc, scale = beta_params print(f"拟合参数:alpha={alpha:.3f}, beta={beta:.3f}, loc={loc:.3f}, scale={scale:.3f}") # 生成覆盖分布区间的有序x轴序列 x_pdf = np.linspace(min(x), max(x), 1000) # 计算对应x序列的PDF值 beta_pdf = stats.beta.pdf(x_pdf, alpha, beta, loc, scale) # 绘制图像:直方图(原始数据分布)+ PDF曲线(拟合结果) plt.figure(figsize=(10,6)) plt.hist(x, bins=10, density=True, alpha=0.5, label='原始数据直方图') plt.plot(x_pdf, beta_pdf, 'r-', linewidth=2, label='拟合的Beta分布PDF') plt.xlabel('数值') plt.ylabel('概率密度') plt.title('Beta分布拟合结果') plt.legend() plt.grid(alpha=0.3) plt.show()
关键修正点说明
- 补充numpy导入:修复原代码中缺失的
import numpy as np - 生成有序x序列:用
np.linspace生成1000个从数据最小值到最大值的均匀点,确保PDF曲线连续平滑 - 结合直方图对比:添加原始数据的密度直方图,能更直观地观察拟合效果
- 优化图像展示:添加标签、图例、网格,提升图像可读性
内容的提问来源于stack exchange,提问作者statsman
相关产品推荐
相关产品推荐

