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

Scipy least squares: is it possible to optimize for two error functions simultaneously?

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

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

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

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

提前致谢!

使用 np.multiply 有什么具体原因吗?由于典型的数学运算符重载了 np.ndarrays,所以写(和读)更方便:

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

回答您的问题:据我所知,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)  

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