首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:最小二乘拟合与拟合参数的边值条件

Python:最小二乘拟合与拟合参数的边值条件
EN

Stack Overflow用户
提问于 2012-03-12 22:44:22
回答 2查看 1.3K关注 0票数 0

我有一个时间序列,我想使用Scipy.optimize.leastsq来适应它的功能。

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-12 23:27:02

只需使用

代码语言:javascript
运行
复制
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())。

票数 3
EN

Stack Overflow用户

发布于 2012-03-14 21:59:34

如果你不能为你的约束求解方程,并且你可以接受满足一定容差的约束,另一种可能性是在卡方中添加一个具有较大权重的项,以确保几乎满足约束。

例如,如果您需要该\sum(sin(pi)==1 ),您可以执行以下操作:

代码语言:javascript
运行
复制
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]))

显然,收敛速度会更慢,但仍然是有保证的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9669229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档