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.ndarray
s,所以写(和读)更方便:
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。
对于这项特定的工作,我正在使用 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.ndarray
s,所以写(和读)更方便:
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。