拟合概率分布到数据

时间:2015-12-04 23:58:52

标签: python numpy pandas scipy probability

我试图将数据拟合到概率分布(在我的情况下是伽玛函数)。

凭借时刻的方法,我取得了一些成功:

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--')

Gamma test 01

然而这并不令人满意所以我决定使用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 test 02

有人可以形容我做错了什么吗? 我认为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)

Gamma test 03

给出更好的结果。好像它现在正在工作。谢谢!

0 个答案:

没有答案