首页 > 解决方案 > 在 Python 中从直方图拟合 PDF 的方法

问题描述

给出的是一个 numpy 数组形式的样本 (r)。我从该样本创建了一个直方图:

plt.hist(x=r, bins='auto', color='#0504aa',alpha=0.7, rwidth=0.85)
objective_prob, bin_edges = np.histogram(r, bins='auto', density=True)
bin_centers = 0.5*(bin_edges[1:] + bin_edges[:-1])

我在这里尝试做的是获取可能的 PDF 的值,它应该被定义为

def f(x, N):
    return N/k*T*np.exp(-N*x**2/2*k*T)

x 是样本(在这种情况下为 r),N 是要拟合的参数。k 和 T 是常数。这是一个玻尔兹曼分布。

第一个问题:我的数组“objective_prob”是否正确,因为它正确地给出了概率密度函数 (PDF) 的值?我之所以问,是因为我不确定我是否正确理解了“normed=True”论点。第二个问题:我对我的 x 轴使用数组 bin_centers 是否正确?

接下来,(重要的一步)。我想进行拟合(以便从函数 f 中获取参数 N)

params, params_covariance = curve_fit(f, bin_centers , objective_prob, p0=None)

在这里,我使用我的数组 bin_centers 作为 x 数据,并将 objective_prob 作为 y 数据。现在,N 的值完全关闭,如果我尝试用

plt.figure(figsize=(6, 4))
plt.plot(bin_centers, objective_prob, label="Histogram")
plt.plot(bin_centers, f(bin_centers, params[0]), 'r-')
plt.legend()
plt.show()

我的拟合曲线得到一条直线。所以第三个问题:我的curve_fit错了吗?我还能在哪里错?在我的curve_fit中使用相应的数组是否正确,还是我错误地使用了bin-centers?

任何帮助是极大的赞赏!谢谢。

标签: pythonnumpyhistogramcurve-fitting

解决方案


推荐阅读