2013-01-16 35 views
0

我试图使用python和lmfit模块进行多参数拟合。我一直在按照here所示的示例作为我的代码的基础。据我了解代码,我应该能够执行最小二乘法拟合,只要我正确定义我的目标函数(给出残差)并提供正确的参数。使用lmfit的蟒蛇极小化在python中使用lmfit

这是我目前的目标函数:

# Define objective function: each data point has a different 
# objective function which is defined by the model method 
# the objective function returns the array to be minimized 
def objfunc(params,trans,sum_in,sum_out,data): 
    """ model fit using branching ratios and resonance strength 
     then subtract data """ 
    model = fit_model(params,trans,sum_in,sum_out) 

    return model - data 

其中fit_model(args*)方法由

def fit_model(params,trans,sum_in,sum_out): 
    """ model the transition based upon the input string trans 
     using parameter convention for the branching """ 
    model = [] 

    # The amplitude: technically the resonance strength term 
    # here it gives the number of resonant decays 
    amp = params['amp'].value 

    # For each transition we want to retrieve the parameter values 
    # for the branching ratios and evaluate the new value for 
    # the fit (of that transition). The easiest way to do this is 
    # to store the braching ratios with the same notation used 
    # previously, and to explicity call those values using the 
    # 'params.['']value' method 
    for i in range(len(trans)): 

     # Employs the termvalue() method to evalueate the branching 
     # and efficiency values 
     model.append(str(amp * termValue(trans[i]) + amp * termValue(sum_in[i]) - amp * termValue(sum_out[i]))) 

    return np.array(model,dtype='float64') 

定义这给了我什么,我希望得到:一个numpy.ndarray我的数据的长度。我遇到的问题是,当我尝试用

result = minimize(objfunc,params,args=(trans,sum_in,sum_out,data)) 

最小化卡方适合我得到的错误信息:

File "path/chisquare.py", line 94, in <module> 
    result = minimize(objfunc,params,args=(trans,sum_in,sum_out,data)) 
    File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 498, in minimize 
    fitter.leastsq() 
    File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 369, in leastsq 
    lsout = scipy_leastsq(self.__residual, self.vars, **lskws) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 278, in leastsq 
    raise TypeError('Improper input: N=%s must not exceed M=%s' % (n,m)) 
TypeError: Improper input: N=26 must not exceed M=25 

我试图找出这意味着从源代码lmfit,但这有点超出我的理解。有谁知道我可以如何解决这个错误?

谢谢

回答

1

这个问题似乎是由于有比数据点更多的参数造成的。检查了我的输入并解决了问题!