1

我有一個模型方程讓我們把它eq_m:結束在SciPy的非線性曲線擬合適合

eq_m

,我知道我的數據集如下,我想適合我的數據eq_m讓我能使用擬合參數來預測新數據。

然而這eq_m是非線性的,因此我用SciPy的的curve_fit得到的λ,μ,Σ-參數值,並使用下面的代碼片斷:

opt_parms, parm_cov = o.curve_fit(eq_m, x, y,maxfev=50000) 
lamb , mu, sigm = opt_parms 

我運行數據的各種基團,其是所有這種模式應該遵循這個模型,並且55/60給了我很好的結果,但是其餘5個組高度過度擬合併且預測具有高正值的參數。有沒有一種方法可以調整曲線擬合,並使用scipy/numpy或scikit-learn來懲罰高量級參數值?

我的導師建議採用共軛先驗,但我不知道該怎麼做在這裏。

任何人都可以幫助我嗎?如果我必須提供一個猜測來解決這個問題,有人可以請告訴我如何計算這些猜測?

回答

2

curve_fit不支持正規化。它總是使用最小二乘成本函數。爲了規範適合性,您需要編寫一個自定義成本函數,您可以使用scipy.optimize.minimize最小化函數。

讓我們先來翻譯進行曲線擬合到最小化問題:

def eq_m(x, lamb, mu, sigm): # assumed signature of eq_m 
    pass 

def cost(params): # simply use globally defined x and y 
    lamb, mu, sigm = params 
    model = eq_m(x, lamb, mu, sigm) 
    return np.mean((model - y)**2) # quadratic cost function 

p0 = [1, 0, 1] # initial guess for lambda, mu, and sigma 
res = o.minimize(cost, p0) 
print(res) # see if minimization succeeded. 
lamb, mu, sigm = res.x 

希望這將讓你同樣的結果curve_fit。 (如果不是這種情況下,現在是時候開始調試。)

現在我們可以用成本函數發揮來實現正規化:

def cost(params): 
    lamb, mu, sigm = params 
    model = eq_m(x, lamb, mu, sigm) 
    reg = lamb**2 + mu**2 + sigm**2 # very simple: higher parameters -> higher cost 
    regweight = 1.0 # determines relative importance of regularization vs goodness of fit 
    return np.mean((model - y)**2) + reg * regweight 

沒有嚴格需要二次懲罰參數。基本上你可以做任何事情,只要確保大參數增加成本。結果會有所不同:-)

所有這些都是一種非常特殊的方法,缺乏嚴謹的理論基礎。主管的使用共軛先驗的建議聽起來像他們期望你使用貝葉斯估計技術。儘管某些先驗可被認爲等同於正則化,該方法是完全不同的,並且可以是數學上相當複雜。相反,你需要定義一個似然函數成本函數,定義在參數先驗,並使用貝葉斯法則得到後驗概率,最終你會最大限度地將它們結合起來。