2012-03-12 48 views
0

我有一個時間序列,我想適合使用Scipy.optimize.leastsq函數。Python:最小二乘擬合與擬合參數的邊條件

fitfunc= lambda a, x:  a[0]+a[1]*exp(-x/a[4])+a[2]*exp(-x/a[5])+a[3]*exp(-x /a[6])  
errfunc lambda a,x,y:  fitfunc(a,x) - y 

接下來我會將errfunc傳遞給leastsq來最小化它。我使用的擬合函數是以不同時間尺度a(4:6)和不同權重(a(0:4))衰減的指數總和。 (作爲sideuqestion:我可以使用leastsq超過1個參數數組嗎?我沒有這樣做......)

問題:如何在輸入fit-功能。我想爲例子合計((0:4))= 1.0

回答

3

只需使用

import numpy as np 

def fitfunc(p, x): 
    a = np.zeros(7) 
    a[1:7] = p[:6] 
    a[0] = 1 - a[1:4].sum() 
    return a[0] + a[1]*exp(-x/a[4]) + a[2]*exp(-x/a[5]) + a[3]*exp(-x/a[6]) 

def errfunc(p, x, y1, y2): 
    return np.concatenate((
     fitfunc(p[:6], x) - y1, 
     fitfunc(p[6:12], x) - y2 
    )) 

一般來說,λ-功能被認爲是不好的風格(和他們沒有在代碼中添加任何東西) 。要在最小二乘擬閤中使用多個函數,您可以按照我使用np.concatenate指示的那樣追加函數。但是,如果沒有任何參數相關,那就沒什麼意義了。它只會減慢算法的收斂速度。您所要求的附帶條件是通過根據您給出的約束計算一個權重來實現的(請參閱1 - a [1:4] .sum())。

0

如果不能求解方程爲你限制,你可以用約束的滿足一些寬容生活,另一種可能性是一個術語添加到卡方與大重量,這保證了約束幾乎滿意。

比如,如果你需要一個\總和(罪(第[1])== 1,您可以執行以下操作:

constraint_func = lambda a: sin(a).sum()-1 

def fitfunc (a,x): 
    np.concatenate((a[0]+a[1]*exp(-x/a[4])+a[2]*exp(-x/a[5])+a[3]*exp(-x /a[6]), 
        [constraint_func(a)])) 

def errfunc(a,x,y): 
    tolerance = 1e-10 
    return np.concatenate((fitfunc(a,x) - y, [tolerance])) 

顯然收斂會慢一些,但將仍然保證

相關問題