如何为直方图拟合自定义概率分布并求解参数绘制对比图
自定义指数多项式分布拟合与可视化实现方案
你给出的分布公式存在符号冲突,归一化常数和x⁴项系数都用了c,下文统一将归一化常数记为C,指数项的x⁴系数记为c,避免混淆。
系数确定方法
- 优先使用极大似然估计,你已有常见分布拟合经验可直接复用思路:
- 构造对数似然函数:对所有样本点x_i,总对数似然为
sum(log(C) + a*x_i + b*x_i² + c*x_i⁴ + d*x_i⁸) - 加入归一化约束:C 为归一化常数,满足
C = 1 / ∫ exp(a*x + b*x² + c*x⁴ + d*x⁸) dx,积分区间取样本的取值范围,可外扩10%避免截断误差,积分直接用数值积分计算即可 - 数值优化求解:把负对数似然作为目标函数,用常规拟牛顿法优化即可,Python可直接调用
scipy.optimize.minimize实现,初始参数可先设为全0,拟合效果不佳的话可以先拿低阶多项式对直方图密度点做简单回归的结果作为初始值。
- 构造对数似然函数:对所有样本点x_i,总对数似然为
- 样本量较小时可改用更简单的最小二乘拟合:先算出直方图每个bin的中点和对应的归一化密度,直接最小化拟合密度和观测密度的平方和即可,不需要计算似然,调试门槛更低。
- 注意:由于指数项包含8阶高次项,拟合时极易过拟合,可在优化目标中加入L2正则项(系数平方和乘以小惩罚系数),避免系数过大导致曲线剧烈震荡。
直方图与拟合曲线同步绘制方法
以Python常用库实现为例,步骤如下:
- 绘制归一化直方图:调用
plt.hist(样本数据, bins=自定义分箱数, density=True, alpha=0.5, label='样本分布'),设置density=True将直方图转为概率密度形式,确保和拟合曲线刻度对齐,alpha设为半透明避免遮挡曲线。 - 生成拟合曲线采样点:在样本最小值到最大值之间生成1000个左右等间隔的x点,例如
x_fit = np.linspace(样本.min(), 样本.max(), 1000) - 计算拟合密度值:代入求解得到的a、b、c、d和归一化常数C,算出每个x_fit对应的f(x)值
- 绘制拟合曲线:调用
plt.plot(x_fit, fit_y, 'r-', linewidth=2, label='自定义分布拟合结果'),最后添加图例、坐标轴标签即可查看对比效果。
内容的提问来源于stack exchange,提问作者CyberMathIdiot
相关产品推荐
相关产品推荐

