已有概率密度函数(p.d.f.),寻求更优模型拟合方法
如何直接拟合已知的概率密度函数(PDF)?
问题背景
我已拥有一个概率密度函数(PDF),通过以下代码绘制:
for i in range(N-100,len(normalized_p),10): plt.plot(x[i], normalized_p[i], label=f'n={i+1}', marker='o')
该PDF呈现单峰右偏的连续分布形态。我需要为其寻找最优参数化分布模型(如gamma、lognorm、beta、burr等)。
之前尝试通过从PDF中采样生成数据,再用Fitter库拟合:
data = np.random.choice(x[N-1], 100000, p=p[N-1]/sump[N-1]) f = Fitter(data, distributions=['gamma', 'lognorm', "beta", "burr"]) f.fit() f.summary()
但这种方法效果很差:采样得到的离散点与直方图区间(bins)错位,导致直方图出现异常尖峰。目前仅能通过给数据添加少量噪声缓解问题,想寻求更优解决方案。
可行优化方案
1. 直接基于PDF曲线拟合(无需采样)
跳过采样步骤,直接用原始的x(横坐标)和normalized_p(对应PDF值),通过非线性最小二乘法拟合参数化分布,完全避免采样带来的离散错位问题:
import numpy as np from scipy.optimize import curve_fit from scipy.stats import gamma, lognorm, beta, burr # 定义待拟合分布的PDF函数 def gamma_pdf(x, a, loc, scale): return gamma.pdf(x, a, loc=loc, scale=scale) def lognorm_pdf(x, s, loc, scale): return lognorm.pdf(x, s, loc=loc, scale=scale) def beta_pdf(x, a, b, loc, scale): return beta.pdf(x, a, b, loc=loc, scale=scale) def burr_pdf(x, c, d, loc, scale): return burr.pdf(x, c, d, loc=loc, scale=scale) # 以gamma分布为例进行拟合 params_gamma, _ = curve_fit(gamma_pdf, x[N-1], normalized_p[N-1], p0=[1, 0, 1]) fit_gamma = gamma_pdf(x[N-1], *params_gamma) # 对其他分布重复上述步骤,通过残差平方和或R²评估拟合效果 sse_gamma = np.sum((normalized_p[N-1] - fit_gamma)**2)
2. 优化采样后的直方图对齐
若必须保留采样步骤,可手动指定直方图的bins与采样的x值完全对齐,消除错位尖峰:
import matplotlib.pyplot as plt # 用采样点的x值作为直方图区间边界 bin_width = np.diff(x[N-1])[0] bins = np.concatenate([x[N-1], [x[N-1][-1] + bin_width]]) # 绘制对齐后的直方图 plt.hist(data, bins=bins, density=True, alpha=0.5) # 叠加拟合的PDF曲线 plt.plot(x[N-1], fit_gamma, label='Gamma Fit')
3. 采用逆变换采样生成连续样本
放弃np.random.choice的离散采样,改用逆变换采样生成更接近连续分布的样本,避免离散点错位:
# 计算原始PDF的累积分布函数(CDF) bin_width = np.diff(x[N-1])[0] cdf = np.cumsum(normalized_p[N-1] * bin_width) cdf = np.concatenate([[0], cdf]) # 补全CDF起始点0 # 生成均匀分布随机数,通过逆变换得到连续采样数据 u = np.random.uniform(0, 1, 100000) data = np.interp(u, cdf, x[N-1])
生成的样本为连续数值,后续用Fitter库拟合的效果会显著提升。
拟合效果评估
可通过以下指标对比不同分布的拟合优劣:
- 残差平方和(SSE):拟合PDF与原始PDF的差值平方和,越小拟合效果越好
- R²系数:衡量拟合曲线对原始数据的解释程度,越接近1效果越好
- Kolmogorov-Smirnov检验:若采用采样法,可检验采样数据与拟合分布的差异
内容的提问来源于stack exchange,提问作者D.R
相关产品推荐
相关产品推荐

