2014-06-20 145 views
1

我想適合我的數據的非對稱概率分佈,我認爲指數修正高斯分佈可以是我的數據的一個很好的代表。我擬合數據的概率分佈並找到它的累積分佈函數

m=array([ 16.25, 16.75, 17.25, 17.75, 18.25, 18.75, 19.25, 19.75, 
      20.25, 20.75, 21.25, 21.75, 22.25, 22.75, 23.25, 23.75, 
      24.25, 24.75, 25.25, 25.75, 26.25, 26.75, 27.25, 27.75, 
      28.25, 28.75, 29.25, 29.75, 30.25, 30.75]) 
pdf=array([ 0.00000000e+00, 2.40818784e-04, 1.38470801e-03, 
      1.62552679e-03, 3.07043949e-03, 3.37146297e-03, 
      5.47862733e-03, 8.36845274e-03, 1.61348585e-02, 
      1.92052980e-02, 2.79951836e-02, 3.97953040e-02, 
      4.95484648e-02, 7.09211318e-02, 9.50030102e-02, 
      1.40878989e-01, 1.90186635e-01, 2.42022878e-01, 
      2.77302830e-01, 2.69054786e-01, 2.40397351e-01, 
      1.74593618e-01, 9.16917520e-02, 2.41420831e-02, 
      7.22456352e-03, 3.01023480e-04, 0.00000000e+00, 
      0.00000000e+00, 0.00000000e+00, 6.02046960e-05]) 

我想用scipy.optimize庫,並在同時也許可以控制擬合度,看看它是爲了改善卡方通過改變輸入參數的初始條件。我寫了下面的一段代碼:

import scipy.special as sse 
from math import * 
import numpy as np 
import scipy.optimize 
#defines the PDF of an exponentially modified Gaussian distribution 
fitfunc =lambda p,x: 0.5*p[2]*np.exp(0.5*p[2]*(2*p[0]+p[2]*p[1]*p[1]-2*x))*sse.erfc((p[0]+p[2]*p[1]*p[1]-x)/(np.sqrt(2)*p[1])) 
"""Deviations of data from fitted curve""" 
errfunc = lambda p, x, y: fitfunc(p, x) - y 
#initial values 
p0=[24,1,1] 
p1, success = scipy.optimize.leastsq(errfunc, p0, args=(pdf, m), maxfev=10000) 

更新:好,我只是選擇了numpy.exp和第一個問題解決了,但仍然leastsq不給我可靠的輸出,我應該怎麼辦?此外,我想獲得CDF這個分配。

+0

你從哪裏得到'exp'和'sse.erfc'? – Ffisegydd

+0

@Ffisegydd被編輯 – Dalek

+0

* pdf *和* m *來自errfunc參數的最後一行?如果他們有問題,errfunc可能會返回一些不是一個單一的數字。您可能需要手動檢查errfunc的返回值,因爲錯誤消息表明它不是單個數字。 – DrV

回答

2

最小二乘法不是用於將數據擬合到給定pdf的方法。 (可能)需要的是最大似然法 - 即最大化p(x | a),其中a是分佈參數,x是數據。通常,一個人形成對數似然並且假定獨立性,所以log p(x | a)= sum(log(pdf(x [i],a)),i,1,n)。

您需要使用最小化函數,將log p(x | a)作爲要最小化的函數,並將a作爲其自由參數。