python - 在 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?
任何帮助是极大的赞赏!谢谢。
解决方案
推荐阅读
- javascript - Vue.js - 根据文本长度为 textarea 应用 CSS 样式
- javascript - 如何在 python http.server 上使用 ES6 模块?
- javascript - 我可以在笑话单元中模拟导入的函数吗
- google-bigquery - Bigquery - 根据时差删除行
- c# - ASP.net Mvc 5 - 在 MVC5 Web 应用程序中从 azure AD 授权的组策略
- java - 正则表达式为字符串值添加引号
- javascript - Fabric.js 3.4 - 在组或多边形上动态调整 SVG strokeWidth
- objective-c - 与类别和扩展相关的面试问题
- c# - 我们可以在 Getter 中使用 Delegates
- java - 将 DynamoDB json sqs 消息转换为普通 json java