[英]Fit distribution to data with uneven bins python
我有一组直方图格式的数据,它们的大小不均匀,代表了马在一生中某个时刻从放牧转向赛跑饮食时的体重。 这是一个数据示例:
重量 - 人数
0-600 磅:340,000
600-699 磅:365,000
700-799 磅:494,000
800-899 磅:430,000
900-999 磅:110000
1000-3000 磅:40,000
我知道 0-600lb 类别的大部分将朝向较重的一端,而 1000-3000lb 类别则相反,所以我正在寻找一个在中间有一个峰值的递减分布。 此外,这可能是两种分布的组合,因为公马和母马的饮食可能在不同的时间切换。 再说一次,如果不考虑这个因素的解决方案仍然很棒,那么也许不是这样!
如何尝试一系列分布以查看哪种分布最适合我在 python 中的数据?
我会假设这些数据将遵循正态分布,所以这就是我要开始的地方。
当 bin 宽度为偶数时,您可以将 bin 中心用作x
值,将 bin 高度用作y
。 在您的情况下,由于 bin 不均匀,您应该使用目标函数的 bin积分与您的数据进行比较。 例如下面的代码:
import scipy.optimize
import scipy.stats
import numpy as np
import matplotlib.pyplot as plt
bins = [0, 600, 700, 800, 900, 1000, 3000]
binc = [ 300, 650, 750, 850, 950, 2000]
weights = [340000, 365000, 494000, 430000, 110000, 40000]
def fGaussianCDF(bins, *params):
N = params[0]
mu = params[1]
sigma = params[2]
binwidth = np.diff(bins)
return N*(scipy.stats.norm.cdf(bins[1:], mu, sigma) - scipy.stats.norm.cdf(bins[:-1], mu, sigma) )
fig, ax = plt.subplots(1, 1)
ax.plot(binc, weights, "ok")
ax.set_xlabel("Weight (lbs.)", fontsize=16)
ax.set_ylabel("Counts", fontsize=16)
popt, _ = scipy.optimize.curve_fit(fGaussianCDF, bins, weights, p0=[1.8e6, 730, 150])
plt.plot(binc, fGaussianCDF(bins, *popt), "rx")
print(popt)
plt.show()
这给出了mu=736
lb 和sigma=146
平均值的最佳拟合结果。 绘制的结果如下所示:
这不是一个完美的选择,但希望是您正在寻找的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.