2012-03-12 47 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])) 

显然收敛会慢一些,但将仍然保证

相关问题