项目场景:
在处理多个计算值与对应的多个已知值之间的差值最小时,我们可以对这些值进行统一处理,进行相减取绝对值后进行求和,最终的差之和就是我们想要优化的目标,使用最小二乘法便可求出最终的解。
∑ i = 1 n ∣ d ( x , M i ) − d i ′ ∣ \sum_{i = 1}^{n}|d(x, M_i)-d_i'| ∑i=1n∣d(x,Mi)−di′∣
其中 d(x, M_i)
表示计算值, x
是要求解的值,
n
n
n 是数据量,
d
i
′
d_i'
di′ 多个已知值。此数据由n
组数据之间的差值得到
scipy.optimize.least_squares
是 SciPy
库是用于解决非线性最小二乘问题的函数,调用此函数后便可计算出最优点。
问题描述
在按照以上步骤,利用scipy.optimize
中的least_squares
求解目标函数的最小值时,当优化方法使用lm
时,发生报错:
ValueError: Method 'lm' doesn't work when the number of residuals is less than the number of variables
.
原因分析:
在使用lm
优化方法时,若残差的数量少于变量的数量,则会报这个错。此时是一个残差,两个变量。
lm
方法基于最小二乘法的原理,需要通过最小化残差的平方和来优化变量。如果残差数量过少,那么就无法有效地确定变量的最优值,因为没有足够的信息来拟合或优化。此时可以将初始函数拆分成单独的残差公式,返回多个残差,以满足算法要求。
解决方案:
修改原函数的实现,确保它正确地计算并返回了与问题规模相匹配的残差数量。此时可以尝试设置多个残差函数计算方法,返回多个残差以满足要求。lm
的计算方法是通过最小化残差的平方和来优化变量,因此可以通过多个残差的计算方法,进行约束变量。
例如:
from scipy.optimize import least_squares
import numpy as np
def fun(x):
residual1 = some_calculation1(x)
residual2 = some_calculation2(x)
return np.array([residual1, residual2])
x0 = some_initial_guess
result = least_squares(fun, x0, method='lm')