Python 使用scipy.stats.gamma和scipy.optimize.minimize估计比例参数

Python 使用scipy.stats.gamma和scipy.optimize.minimize估计比例参数,python,numpy,scipy,Python,Numpy,Scipy,我试图通过使用scipy.stats.gamma和scipy.optimize.minimize以及我的数据来估计scale参数。 我建立了一个要评估的功能: def loss_func(para, x, y): return sum((gamma.cdf(x, para[0], para[1])-y)**2)/2 及 这样,willres.x[1]返回比例参数,willres.x[0]返回形状参数?不,我认为您没有正确理解。有关累积分布函数方法,请参见scipy.stats的文档:.

我试图通过使用
scipy.stats.gamma
scipy.optimize.minimize
以及我的数据来估计scale参数。 我建立了一个要评估的功能:

def loss_func(para, x, y):
    return sum((gamma.cdf(x, para[0], para[1])-y)**2)/2


这样,will
res.x[1]
返回比例参数,will
res.x[0]
返回形状参数?

不,我认为您没有正确理解。有关累积分布函数方法,请参见
scipy.stats
的文档:
.cdf(x,a,loc=0,scale=1)
,函数:

def loss_func(para, x, y):
    return sum((gamma.cdf(x, para[0], para[1])-y)**2)/2
para[0]
变为
a
,因此形状参数和
para[1]
变为
loc
,这是位置参数。因此,
res.x[1]
返回位置,
res.x[0]
返回形状,这不是您想要的

因此,您应该将函数更改为:

def loss_func(para, x, y):
    return sum((gamma.cdf(x, para[0], scale=para[1])-y)**2)/2

现在,请记住,您实际上是在进行最小二乘最小化,以使经验CDF与伽马CDF相匹配。@behzad.nouri建议使用
.fit()
方法,这是一种最大似然法。这两者是不同的,预期结果会有所不同。如果您有原始数据(而不是经验CDF),则最好使用
.fit()
.fit\u loc\u scale()
方法

您不使用
gamma.fit\u loc\u scale
gamma.fit
的任何原因?对。因为我只知道cdf而不知道数据的pdf。请查看
帮助(gamma.fit)
帮助(gamma.fit\u loc\u scale)
def loss_func(para, x, y):
    return sum((gamma.cdf(x, para[0], scale=para[1])-y)**2)/2