用(python)Scipy拟合伽马分布
有没有人能帮我在Python中拟合一个伽马分布?我有一些数据:X和Y坐标,我想找到适合这个分布的伽马参数……在Scipy文档中,发现确实有一个拟合的方法,但我不知道怎么用 :s……首先,"data"这个参数需要什么格式?还有,我该怎么提供第二个参数(也就是我想要找的那些参数)呢?
5 个回答
2
如果你想要一个详细的例子,包括如何估计或修正分布的支持范围的讨论,你可以在这个链接找到:https://github.com/scipy/scipy/issues/1359,还有相关的邮件列表信息。
在scipy的主版本中,已经添加了初步的支持,可以在拟合时修正一些参数,比如位置参数。
9
我对ss.gamma.rvs这个函数不太满意,因为它会生成负数,而伽马分布是不能有负数的。所以我通过样本的期望值(就是数据的平均值)和方差(数据的变化程度)来调整样本(具体细节可以查一下维基百科),然后写了一个函数,可以在不使用scipy的情况下生成伽马分布的随机样本(顺便说一下,我发现scipy安装起来挺麻烦的):
import random
import numpy
data = [6176, 11046, 670, 6146, 7945, 6864, 767, 7623, 7212, 9040, 3213, 6302, 10044, 10195, 9386, 7230, 4602, 6282, 8619, 7903, 6318, 13294, 6990, 5515, 9157]
# Fit gamma distribution through mean and average
mean_of_distribution = numpy.mean(data)
variance_of_distribution = numpy.var(data)
def gamma_random_sample(mean, variance, size):
"""Yields a list of random numbers following a gamma distribution defined by mean and variance"""
g_alpha = mean*mean/variance
g_beta = mean/variance
for i in range(size):
yield random.gammavariate(g_alpha,1/g_beta)
# force integer values to get integer sample
grs = [int(i) for i in gamma_random_sample(mean_of_distribution,variance_of_distribution,len(data))]
print("Original data: ", sorted(data))
print("Random sample: ", sorted(grs))
# Original data: [670, 767, 3213, 4602, 5515, 6146, 6176, 6282, 6302, 6318, 6864, 6990, 7212, 7230, 7623, 7903, 7945, 8619, 9040, 9157, 9386, 10044, 10195, 11046, 13294]
# Random sample: [1646, 2237, 3178, 3227, 3649, 4049, 4171, 5071, 5118, 5139, 5456, 6139, 6468, 6726, 6944, 7050, 7135, 7588, 7597, 7971, 10269, 10563, 12283, 12339, 13066]
83
生成一些伽马数据:
import scipy.stats as stats
alpha = 5
loc = 100.5
beta = 22
data = stats.gamma.rvs(alpha, loc=loc, scale=beta, size=10000)
print(data)
# [ 202.36035683 297.23906376 249.53831795 ..., 271.85204096 180.75026301
# 364.60240242]
在这里,我们将这些数据拟合到伽马分布上:
fit_alpha, fit_loc, fit_beta=stats.gamma.fit(data)
print(fit_alpha, fit_loc, fit_beta)
# (5.0833692504230008, 100.08697963283467, 21.739518937816108)
print(alpha, loc, beta)
# (5, 100.5, 22)