在前面3节中,我们使用了不同下降方法来求解同一个非线性最小二乘问题,但其实非线性最小二乘问题只是这些下降方法能够求解的问题当中的一个特例。接下来要介绍的方法,将是专门针对非线性最小二乘问题设计的,具有非常优良的相性。由于非线性最小二乘问题的应用广泛,这个方法的介绍也是尤为重要的。
下面来看一些基本的数学表达:
梯度: g = ∇ f ( x ) g=\nabla f(x) g=∇f(x)
黑森矩阵: G = ∇ 2 f ( x ) G=\nabla^2 f(x) G=∇2f(x)
雅可比矩阵: J ( x ) = [ ∂ y 1 ∂ x 1 . . . ∂ y 1 ∂ x n ⋮ ⋱ ⋮ ∂ y m ∂ x 1 . . . ∂ y m ∂ x n ] J(x)=\left[\begin{matrix}\frac{\partial y_1}{\partial x_1}&...&\frac{\partial y_1}{\partial x_n}\\\vdots&\ddots&\vdots\\\frac{\partial y_m}{\partial x_1}&...&\frac{\partial y_m}{\partial x_n}\end{matrix}\right] J(x)=⎣⎢⎡∂x1∂y1⋮∂x1∂ym...⋱...∂xn∂y1⋮∂xn∂ym⎦⎥⎤
雅可比矩阵作用:如果 P P P是 R n R^n Rn中的一点, F F F在 P P P点可微分,那么在这一点的导数由 J F ( P ) J_F(P) JF(P)给出,在此情况下,由 F ( P ) F(P) F(P)描述的线性算子即接近点 P P P的 F F F的最优线性逼近: F ( x ) ≈ F ( P ) + J F ( P ) ( X − P ) F(x)\approx F(P)+J_F(P)(X-P) F(x)≈F(P)+JF(P)(X−P)
残差:表示实际观测值与估计值(拟合值)之间的差
多维无约束牛顿法: x k + 1 = x k − G k − 1 g k x_{k+1}=x_k-G_k^{-1}g_k xk+1=xk−Gk−1gk
对于非线性最小二乘问题,假设有 n n n个待定系数( x ∈ R n x\in R^n x∈Rn)和 m m m组样本( m ≥ n m\geq n m≥n,这是确定待定系数的必要条件),则残差函数: r i ( x ) = y i − f ~ ( x ; t i ) , i = 1 , . . . , m r_i(x)=y_i-\tilde{f}(x;t_i),i=1,...,m ri(x)=yi−f~(x;ti),i=1,...,m。
设 r ( x ) = [ r 1 ( x ) ⋮ r m ( x ) ] r(x)=\left[\begin{matrix}r_1(x)\\\vdots\\r_m(x)\end{matrix}\right] r(x)=⎣⎢⎡r1(x)⋮rm(x)⎦⎥⎤
则非线性最小二乘问题的目标函数为 m i n f ( x ) = m i n { 1 2 ∑ i = 1 m [ r i ( x ) ] 2 } = m i n { 1 2 r ( x ) T r ( x ) } min f(x)=min\{\frac{1}{2}\displaystyle\sum_{i=1}^m[r_i(x)]^2\}=min\{\frac{1}{2}r(x)^Tr(x)\} minf(x)=min{ 21i=1∑m[ri(x)]2}=min{ 21r(x)Tr(x)}
同时我们也可以得到 r ( x ) r(x) r(x)的雅可比矩阵:
J r ( x ) = [ ∂ r 1 ∂ x 1 . . . ∂ r 1 ∂ x n ⋮ ⋱ ⋮ ∂ r m ∂ x 1 . . . ∂ r m ∂ x n ] = [ ∇ r 1 T ⋮ ∇ r m T ] J_{r}(x)=\left[\begin{matrix}\frac{\partial r_1}{\partial x_1}&...&\frac{\partial r_1}{\partial x_n}\\\vdots&\ddots&\vdots\\\frac{\partial r_m}{\partial x_1}&...&\frac{\partial r_m}{\partial x_n}\end{matrix}\right]=\left[\begin{matrix}\nabla r_1^T\\\vdots\\\nabla r_m^T\end{matrix}\right] Jr(x)=⎣⎢⎡∂x1∂r1⋮∂x1∂rm...⋱...∂xn∂r1⋮∂xn∂rm⎦⎥⎤=⎣⎢⎡∇r1T⋮∇rmT⎦⎥⎤
用牛顿法来优化该函数,对 f f f求梯度得 g = ∇ f = 2 ∑ i = 1 m r i ∂ r i ∂ x j g=\nabla f=2\displaystyle\sum_{i=1}^mr_i\frac{\partial r_i}{\partial x_j} g=∇f=2i=1∑mri∂xj∂ri,再对所有元分别求导得 G j k = 2 ∑ i = 1 m ( ∂ r i ∂ x j ∂ r i ∂ x k + r i ∂ 2 r i ∂ x j ∂ x k ) G_{jk}=2\displaystyle\sum_{i=1}^m(\frac{\partial r_i}{\partial x_j}\frac{\partial r_i}{\partial x_k}+r_i\frac{\partial^2r_i}{\partial x_j\partial x_k}) Gjk=2i=1∑m(∂xj∂ri∂xk∂ri+ri∂xj∂xk∂2ri)。由于二阶导数非常小,一般可以忽略,则 g ( x ) = ∑ i = 1 m r i ( x ) ∇ r i ( x ) = J r ( x ) T r ( x ) , G ( x ) = J r ( x ) T J r ( x ) g(x)=\displaystyle\sum_{i=1}^mr_i(x)\nabla r_i(x)=J_r(x)^Tr(x),G(x)=J_r(x)^TJ_r(x) g(x)=i=1∑mri(x)∇ri(x)=Jr(x)Tr(x),G(x)=Jr(x)TJr(x),相应的迭代式被改写为 x k + 1 = x k + d k , d k = − ( J r T J r ) − 1 J r T r x_{k+1}=x_k+d_k,d_k=-(J_r^TJ_r)^{-1}J_r^Tr xk+1=xk+dk,dk=−(JrTJr)−1JrTr。
假如采用阻尼牛顿法来搜索,则步骤如下所示:
高斯-牛顿法可以说是牛顿法的一个改进方案,但并非是万能的。若雅可比矩阵奇异,则d无解,这说明单纯使用雅可比矩阵不能很好地近似原函数的梯度与黑森矩阵了。不解方程组 J k T J k d k = − J k T r k J_k^TJ_kd_k=-J_k^Tr_k JkTJkdk=−JkTrk,而是考虑最小二乘问题 ( J k T J k + v k I ) d = − J k T r k (J_k^TJ_k+v_kI)d=-J_k^Tr_k (JkTJk+vkI)d=−JkTrk,即使用一个因子 v k I v_kI vkI来去奇异。这个因子通过**信赖域方法(LM法)**来确定,根据雅可比矩阵近似的函数变化率与真实函数变化率的差别来增大或减小。
根据我们之前的近似 g ( x ) = ∑ i = 1 m r i ( x ) ∇ r i ( x ) = J r ( x ) T r ( x ) , G ( x ) = J r ( x ) T J r ( x ) g(x)=\displaystyle\sum_{i=1}^mr_i(x)\nabla r_i(x)=J_r(x)^Tr(x),G(x)=J_r(x)^TJ_r(x) g(x)=i=1∑mri(x)∇ri(x)=Jr(x)Tr(x),G(x)=Jr(x)TJr(x)。将 m i n f ( x k + d ) minf(x_k+d) minf(xk+d)近似为 m i n q k ( d ) = 1 2 ∣ ∣ J k d + r k ∣ ∣ 2 minq_k(d)=\frac{1}{2}||J_kd+r_k||^2 minqk(d)=21∣∣Jkd+rk∣∣2,其中 q k ( d ) = 1 2 ( J k d + r k ) T ( J k d + r k ) = 1 2 d T J k T J k d + d T ( J k T r k ) + 1 2 r k T r k q_k(d)=\frac{1}{2}(J_kd+r_k)^T(J_kd+r_k)=\frac{1}{2}d^TJ_k^TJ_kd+d^T(J_k^Tr_k)+\frac{1}{2}r_k^Tr_k qk(d)=21(Jkd+rk)T(Jkd+rk)=21dTJkTJkd+dT(JkTrk)+21rkTrk。
f ( x ) f(x) f(x)的实际减少量为 Δ f k = f ( x k ) − f ( x k + d k ) \Delta f_k=f(x_k)-f(x_k+d_k) Δfk=f(xk)−f(xk+dk), q ( d ) q(d) q(d)的减少量为 Δ q k = q ( 0 ) − q ( d k ) \Delta q_k=q(0)-q(d_k) Δqk=q(0)−q(dk)。
定义 γ k = Δ f k Δ q k \gamma_k=\frac{\Delta f_k}{\Delta q_k} γk=ΔqkΔfk,给出如下准则:
LMF方法步骤如下:
对于第一节中提出的最小二乘问题, x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4的初值均在 [ − 2 , 2 ] [-2,2] [−2,2]的范围内随机生成,总共生成100组起点。统计迭代成功(在1000步内得到最优解且单次步长搜索迭代次数不超过1000次)的样本的平均迭代步数、平均迭代时间和得到的最优解及残差平方和最小值。
平均迭代步数 | 平均迭代时间 | 最优解 | 残差平方和最小值 |
---|---|---|---|
7.2 | 0.06s | x 1 = 0.1925 x 2 = 0.1959 x 3 = 0.1234 x 4 = 0.1383 x_1=0.1925~x_2=0.1959~x_3=0.1234~ x_4=0.1383 x1=0.1925 x2=0.1959 x3=0.1234 x4=0.1383 | 1.5378 × 1 0 − 4 1.5378\times10^{-4} 1.5378×10−4 |
7种方法分别是最速梯度下降法、牛顿-梯度下降混合法、BFGS拟牛顿法、DFP拟牛顿法、共轭梯度PRP+法、共轭梯度FR法和LMF法,对实战测试的迭代步数、计算时间和残差平方和最小值进行均值归一化后进行对比。
可以发现BFGS法、PRP+法和LMF法均有不俗的表现。其中LMF法是专门针对最小二乘问题的方法,在该问题上表现最为突出。
PRP+法作为共轭梯度法,在储存容量上相较BFGS法优势更大。因此虽然对于待定系数只有4个的测试问题,两者的差别不是非常明显,但遇到大规模最优化问题时,更推荐采用PRP+法。
from Function import Function #定义法求导工具
import numpy as np
from scipy import linalg
from lagb import * #线性代数工具库
n=4 #待定系数数
y=np.array([])
t=np.array([])
#样本列表
def myFunc(x):
return #目标方程(残差平方和的0.5倍)
def r(x):
return #残差方程。y=y[int(x[n+1])],t=t[int(x[n+1])]
def Jaccobi(x):
tar=Function(r)
mat=np.empty((y.shape[0],n))
for j in range(0,y.shape[0]):
for i in range(0,n):
mat[j][i]=tar.part(i,np.append(x,j))
return mat
def q(J,R,d):
return 0.5*muldot(turn(d),turn(J),J,d)+dot(turn(d),dot(turn(J),R))+0.5*dot(turn(R),R)
e=0.001
k=0
v=np.eye(n)
tar=Function(myFunc)
x=np.zeros(n) #初值点
while tar.norm(np.concatenate((x,t)))>e:
J=Jaccobi(x)
A=dot(turn(J),J)+v
R=np.empty(0)
for i in range(0,t.shape[0]):
R=np.append(R,r(np.append(x,i)))
b=-dot(turn(J),R)
d=linalg.solve(A,b)
gamma=(tar.value(x)-tar.value(x+d))/(q(J,R,np.zeros(n))-q(J,R,d))
if gamma<0.25:
v*=4
elif gamma>0.75:
v/=2
if gamma>0:
x+=d
k+=1
print(k)