我试图将数据拟合到概率分布(在我的情况下是伽玛函数)。
凭借时刻的方法,我取得了一些成功:
mean, var = data.mean(), data.var()
α, β = mean ** 2 / var, var / mean
x = np.linspace(0, 100)
plt.plot(x, gamma.pdf(x, α, 0, β))
# Pandas is in use
data.plot(kind='hist', xlim=(0, 100), bins=500, normed=True, color='lightblue')
data.dropna().plot(kind='kde', xlim=(0, 100), style='r--')
然而这并不令人满意所以我决定使用scipy的方法fit
:
args = gamma.fit(data)
x = np.linspace(0, 100)
plt.plot(x, gamma.pdf(x, *args))
data.plot(kind='hist', xlim=(0, 100), bins=500, normed=True, color='lightblue')
data.dropna().plot(kind='kde', xlim=(0, 100), style='r--')
但我取得的唯一结果就是这个分布:
有人可以形容我做错了什么吗?
我认为gamma.fit
应该至少与时刻方法一样好。
UPD:
gamma.fit
会返回:(0.00077655597754514266, -6.0499462017751218e-25, 3.6337557495676194)
data.describe()
显示数据正常:
count 5546.000000
mean 45.601515
std 28.563211
min 0.000000
25% 35.000000
50% 42.000000
75% 52.000000
max 1488.000000
dtype: float64
尝试将data[[data > 0]]
强制位置数据过滤到0
args = gamma.fit(list(data[[data > 0]]), floc=0)
args
(7.897834117836718, 0, 5.7749678991293987)
给出更好的结果。好像它现在正在工作。谢谢!