我有一个时间序列,我想使用Scipy.optimize.leastsq来适应它的功能。
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))衰减的总和。(附带问题:我可以使用带有1个以上参数数组的至少一个吗?我没有成功做到这一点……)
问题:如何在进入fit-function的参数上添加额外的边条件。例如,我希望sum(a(0:4))=1.0
发布于 2012-03-12 23:27:02
只需使用
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
))通常,lambda函数被认为是糟糕的风格(并且它们不会在您的代码中添加任何内容)。要在最小二乘拟合中包含多个函数,只需按照我在np.concatenate中指出的那样附加这些函数即可。但是,如果没有任何参数是相关的,这就没有多大意义。这只会减慢算法的收敛速度。你所要求的边条件是通过根据你给出的约束计算一个权重来实现的(参见1- a1:4.sum())。
发布于 2012-03-14 21:59:34
如果你不能为你的约束求解方程,并且你可以接受满足一定容差的约束,另一种可能性是在卡方中添加一个具有较大权重的项,以确保几乎满足约束。
例如,如果您需要该\sum(sin(pi)==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]))显然,收敛速度会更慢,但仍然是有保证的。
https://stackoverflow.com/questions/9669229
复制相似问题