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

已有概率密度函数(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:45:35