2015-09-03 37 views
2

有沒有一種方法可以根據具有任意數量的因變量的函數構造一個lmfit模型?例如:用任意數量的參數創建一個python lmfit模型

from lmfit import Model 

def my_poly(x, *params): 
    func = 0 
    for i in range(len(params)): 
    func+= params[i]*z**i 
    return func 

#note: below does not work 
my_model = Model(my_poly, independent_vars = ['x'], param_names = ['A','B','C']) 

東西類似,如果我感興趣的多項式系列,並希望作爲該系列增大或縮小,以測試性能上面的將是美好的。

回答

3

由於Model()使用函數參數的名稱建立參數名稱,使用*params不會輕易的工作(怎麼會一個知道ABC,而不是coeff0coeff1coeff2,還是其他什麼東西給他們打電話?)。

我不知道真的任意數字可以被支持,但應該可以做一個非常大的數字。多項式模型(參見http://lmfit.github.io/lmfit-py/builtin_models.html#polynomialmodelhttps://github.com/lmfit/lmfit-py/blob/master/lmfit/models.py#L126的實現)支持多達7個係數。把它擴大到更大的數字應該不成問題。它可能很容易導致計算問題,但我認爲這就是你期望探索的。

如果你願意做一個小的改變,它有可能做你想要的東西。這使用關鍵字參數而不是位置參數,並且依賴於參數名稱順序(即與sort)來指示哪個係數與什麼指數一起使用,而不是位置參數的順序。這可能接近你要找的東西:

import numpy as np 

from lmfit import Model, Parameters 

def my_poly(x, **params): 
    val= 0.0 
    parnames = sorted(params.keys()) 
    for i, pname in enumerate(parnames): 
     val += params[pname]*x**i 
    return val 

my_model = Model(my_poly) 

# Parameter names and starting values 
params = Parameters() 
params.add('C00', value=-10) 
params.add('C01', value= 5) 
params.add('C02', value= 1) 
params.add('C03', value= 0) 
params.add('C04', value= 0) 

x = np.linspace(-20, 20, 101) 
y = -30.4 + 7.8*x - 0.5*x*x + 0.03 * x**3 + 0.009*x**4 
y = y + np.random.normal(size=len(y), scale=0.2) 

out = my_model.fit(y, params, x=x) 
print(out.fit_report()) 

希望有所幫助。

+0

非常好!我已經探索了內置的多項式模型,但在我的實際分析中很難使用。但是,你建議考慮kwargs而不是args是完美的。謝謝。 –

+0

Whille是關於這個任意數量參數的話題,能否說適合任意數量的gaussians?即高斯模型的數量是多少?當然有限制說從2 - 10最大?提前致謝。 – user1301295

相關問題