微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scipy 最小二乘法:是否可以同时优化两个误差函数?

如何解决Scipy 最小二乘法:是否可以同时优化两个误差函数?

对于这项特殊的工作,我使用 scipy optimize 来尝试找到同时适合两个不同模型的最佳参数。

model_func_par = lambda t,total,r0,theta:  np.multiply((total/3),(1+2*r0),np.exp(-t/theta))
model_func_perp = lambda t,(1-r0),np.exp(-t/theta)) 

在此之后,我通过减去原始数据来创建两个误差函数,并将其插入 scipy.optimize.leastsq()。如您所见,我有两个具有相同 r0 和 theta 参数的不同方程 - 我必须找到最适合这两个方程的参数(理论上,两个方程的 r0 和 theta 应该相同,但由于噪声和实验误差等等,我相信情况并非如此。

我想我可以对每个方程进行单独的优化,也许取两个结果的平均值,但我想看看是否有人知道对这两个方程进行一次优化的方法

提前致谢!

解决方法

使用 np.multiply 有什么特殊原因吗?由于典型的数学运算符对 np.ndarray 进行了重载,因此写入(和读取)更方便:

model1 = lambda t,total,r0,theta: (total/3) * (1+2*r0) * np.exp(-t/theta) 
model2 = lambda t,theta: (total/3) * (1-r0) * np.exp(-t/theta) 

回答您的问题:AFAIK scipy.optimize.least_squares 不可能做到这一点。然而,一个非常简单的方法是最小化最小二乘残差的总和

min || model1(xdata,*coeffs) - ydata ||^2 + || model2(xdata,*coeffs) - ydata ||^2

像这样:

import numpy as np
from scipy.optimize import minimize
from scipy.linalg import norm

# your xdata and ydata as np.ndarrays
# xdata = np.array([...])
# ydata = np.array([...])

# the objective function to minimize
def obj(coeffs):
    return norm(model1(xdata,*coeffs)-ydata)**2 + norm(model2(xdata,*coeffs)-ydata)**2

# the initial point (coefficients)
coeffs0 = np.ones(3)

# res.x contains your coefficients
res = minimize(obj,x0=coeffs0)  

但是,请注意,这不是一个完整的答案。更好的方法是将其表述为多目标优化问题。为此,您可以查看 pymoo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。