我正在尝试使用scipy.stats.gamma
和scipy.optimize.minimize
以及我的数据来估算比例参数。
我建立了一个待评估的函数:
def loss_func(para, x, y):
return sum((gamma.cdf(x, para[0], para[1])-y)**2)/2
和
res=minimize(loss_func, ini0, (x ,y), method='nelder-mead')
这样,res.x[1]
会返回比例参数,res.x[0]
会返回形状参数吗?
答案 0 :(得分:1)
不,我认为你做得不对。有关您的函数,请参阅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与Gamma CDF相匹配。 @ behzad.nouri建议使用.fit()
方法的是最大似然法。这两者是不同的,预计结果会有所不同。如果您有原始数据(而不是经验CDF),那么最好使用.fit()
或.fit_loc_scale()
方法。