我想在我的数据中使用伽玛分布,我使用这个
import scipy.stats as ss
import scipy as sp
import numpy as np
import os
import matplotlib.pyplot as plt
alpha = []
beta = []
loc = []
data = np.loadtxt(data)
fit_alpha, fit_loc, fit_beta = ss.gamma.fit(data, floc=0, fscale=1)
我希望将伽玛分布中的一个参数保留为变量(比如形状),并修复其中一个参数(比如scale=1
)。但是,如果我将loc变量保持为零,我无法将比例固定为一。这有什么解决方法吗?我是否可以仅使用形状和比例来参数化伽玛分布?
答案 0 :(得分:6)
在评论中我说你遇到了gamma
发行版中的错误 - 它不会让你修复位置和比例。该错误已在scipy 0.13中修复,但如果无法升级,则可以使用类fit
的{{1}}方法解决该错误,该方法是{{1}的父类。 }:
rv_continuous
答案 1 :(得分:1)
查看gamma.fit的实现:
def fit(self, data, *args, **kwds):
floc = kwds.get('floc', None)
if floc == 0:
xbar = ravel(data).mean()
logx_bar = ravel(log(data)).mean()
s = log(xbar) - logx_bar
def func(a):
return log(a) - special.digamma(a) - s
aest = (3-s + math.sqrt((s-3)**2 + 24*s)) / (12*s)
xa = aest*(1-0.4)
xb = aest*(1+0.4)
a = optimize.brentq(func, xa, xb, disp=0)
scale = xbar / a
return a, floc, scale
else:
return super(gamma_gen, self).fit(data, *args, **kwds)
如果你把floc = None,它会调用父类的fit函数(rv_continuous),你可以修改比例。