2013-12-22 37 views
0

我想通過使用scipy.stats.gammascipy.optimize.minimize以及我的數據來估計比例參數。 我建立一個函數來進行評估:通過使用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]返回形狀參數?

+2

你沒有使用'gamma.fit_loc_scale'或'gamma.fit'的原因? –

+0

沒錯。因爲我只知道cdf而不知道數據的pdf。 – Cosmozhang

+0

看看'help(gamma.fit)'和'help(gamma.fit_loc_scale)' –

回答

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伽瑪CDF。 What @ behzad.nouri建議使用.fit()方法,它是一種最大似然法。這兩個是不同的,結果預計會有所不同。如果您有原始數據(而不是經驗性CDF),則最好使用.fit().fit_loc_scale()方法。