使用(python)Scipy拟合伽玛分布

时间:2010-05-24 10:18:19

标签: python scipy distribution gamma-distribution

任何人都可以帮助我在python中安装gamma分布吗?好吧,我有一些数据:X和Y坐标,我想找到适合这种分布的伽玛参数......在Scipy doc中,事实证明一种拟合方法确实存在,但我不知道知道如何使用它:s ..首先,参数“data”必须采用哪种格式,如何提供第二个参数(参数),因为那是我正在寻找的?

5 个答案:

答案 0 :(得分:46)

生成一些伽玛数据:

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)

答案 1 :(得分:4)

我对ss.gamma.rvs函数不满意,因为它可以生成负数,而伽玛分布应该没有。所以我通过期望值=平均值(数据)和方差= var(数据)拟合样本(详见维基百科)并编写了一个函数,可以生成没有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]

答案 2 :(得分:1)

如果您需要一个很长的示例,包括有关估算或修复分发支持的讨论,那么您可以在https://github.com/scipy/scipy/issues/1359和链接的邮件列表消息中找到它。

在scipy的主干版本中添加了在适合期间修复参数(例如位置)的初步支持。

答案 3 :(得分:0)

1):"数据"变量可以是python列表或元组的格式,也可以是numpy.ndarray,可以通过以下方式获得:

data=numpy.array(data)

其中上一行中的第二个数据应该是包含数据的列表或元组。

2:"参数"变量是您可以选择提供给拟合函数作为拟合过程的起点的第一个猜测,因此可以省略。

3:关于@ mondano答案的说明。使用矩(平均值和方差)来计算伽马参数对于大的形状参数(α> 10)是相当好的,但是对于小的α值可能产生差的结果(参见大气scineces中的统计方法< / em> by Wilks,THOM,HCS,1958:关于伽玛分布的一个注释.Mon. Wea.Rev。,86,117-122。

在scipy模块中实现的最大似然估计,在这种情况下被认为是更好的选择。

答案 4 :(得分:0)

OpenTURNS具有使用GammaFactory类的简单方法。

首先,让我们生成一个示例:

import openturns as ot
gammaDistribution = ot.Gamma()
sample = gammaDistribution.getSample(100)

然后为它添加一个伽玛:

distribution = ot.GammaFactory().build(sample)

然后我们可以绘制Gamma的PDF:

import openturns.viewer as otv
otv.View(distribution.drawPDF())

产生:

A gamma distribution

有关此主题的更多详细信息,请访问:http://openturns.github.io/openturns/latest/user_manual/_generated/openturns.GammaFactory.html