非线性优化:高斯-牛顿法的原理与实现
引言
在实际应用中,很多问题都是非线性的。非线性优化问题广泛应用于机器学习、数据拟合、工程设计等领域。高斯-牛顿法是一种常用于解决非线性最小二乘问题的迭代算法。本文将详细介绍高斯-牛顿法的原理、推导过程,并通过Python代码实现该算法。
高斯-牛顿法原理
问题定义
非线性最小二乘问题可以表示为:
  
      
       
        
         
          
          
            min 
           
          
             
           
          
         
           x 
          
         
         
         
           ∑ 
          
          
          
            i 
           
          
            = 
           
          
            1 
           
          
         
           m 
          
         
        
          [ 
         
         
         
           r 
          
         
           i 
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
         
         
           ] 
          
         
           2 
          
         
        
       
         \min_{\mathbf{x}} \sum_{i=1}^m [r_i(\mathbf{x})]^2 
        
       
     xmini=1∑m[ri(x)]2
 其中, 
     
      
       
       
         x 
        
       
      
        \mathbf{x} 
       
      
    x 是需要优化的参数向量, 
     
      
       
        
        
          r 
         
        
          i 
         
        
       
         ( 
        
       
         x 
        
       
         ) 
        
       
      
        r_i(\mathbf{x}) 
       
      
    ri(x)是残差函数。
高斯-牛顿法
高斯-牛顿法的基本思想是利用泰勒展开对非线性函数进行线性近似,然后求解线性最小二乘问题。具体步骤如下:
- 初始猜测参数 x 0 \mathbf{x}_0 x0。
- 迭代更新参数 
      
       
        
        
          x 
         
        
       
         \mathbf{x} 
        
       
     x:
 x k + 1 = x k − ( J T J ) − 1 J T r ( x k ) \mathbf{x}_{k+1} = \mathbf{x}_k - (\mathbf{J}^T \mathbf{J})^{-1} \mathbf{J}^T \mathbf{r}(\mathbf{x}_k) xk+1=xk−(JTJ)−1JTr(xk)
 其中, J \mathbf{J} J 是残差函数 r ( x ) \mathbf{r}(\mathbf{x}) r(x)对参数 x \mathbf{x} x 的雅可比矩阵。
雅可比矩阵
雅可比矩阵 
     
      
       
       
         J 
        
       
      
        \mathbf{J} 
       
      
    J 的每个元素定义为:
  
      
       
        
         
         
           J 
          
          
          
            i 
           
          
            j 
           
          
         
        
          = 
         
         
          
          
            ∂ 
           
           
           
             r 
            
           
             i 
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
          
          
            ∂ 
           
           
           
             x 
            
           
             j 
            
           
          
         
        
       
         J_{ij} = \frac{\partial r_i(\mathbf{x})}{\partial x_j} 
        
       
     Jij=∂xj∂ri(x)
Python实现
下面的代码展示了如何使用高斯-牛顿法解决非线性最小二乘问题。
示例问题
我们以一个简单的非线性函数为例:
  
      
       
        
        
          y 
         
        
          = 
         
        
          a 
         
        
          exp 
         
        
           
         
        
          ( 
         
        
          b 
         
        
          x 
         
        
          ) 
         
        
          + 
         
        
          c 
         
        
       
         y = a \exp(b x) + c 
        
       
     y=aexp(bx)+c
 给定一组数据点  
     
      
       
       
         ( 
        
        
        
          x 
         
        
          i 
         
        
       
         , 
        
        
        
          y 
         
        
          i 
         
        
       
         ) 
        
       
      
        (x_i, y_i) 
       
      
    (xi,yi),拟合参数  
     
      
       
       
         a 
        
       
         , 
        
       
         b 
        
       
         , 
        
       
         c 
        
       
      
        a, b, c 
       
      
    a,b,c。
代码实现
import numpy as np
import matplotlib.pyplot as plt
def residuals(params, x, y):
    a, b, c = params
    return y - (a * np.exp(b * x) + c)
def jacobian(params, x):
    a, b, c = params
    J = np.zeros((len(x), len(params)))
    J[:, 0] = -np.exp(b * x)
    J[:, 1] = -a * x * np.exp(b * x)
    J[:, 2] = -1
    return J
def gauss_newton(x, y, initial_params, max_iter=100, tol=1e-6):
    params = np.array(initial_params)
    for i in range(max_iter):
        r = residuals(params, x, y)
        J = jacobian(params, x)
        delta = np.linalg.inv(J.T @ J) @ J.T @ r
        params = params - delta
        
        if np.linalg.norm(delta) < tol:
            break
    
    return params
# 生成示例数据
np.random.seed(0)
x = np.linspace(0, 1, 100)
a_true, b_true, c_true = 2, -1, 0.5
y_true = a_true * np.exp(b_true * x) + c_true
y_noisy = y_true + 0.1 * np.random.normal(size=x.size)
# 高斯-牛顿法拟合
initial_params = [1, -0.5, 0]
params_estimated = gauss_newton(x, y_noisy, initial_params)
# 输出结果
print("Estimated parameters:", params_estimated)
print("True parameters:", [a_true, b_true, c_true])
# 可视化拟合结果
y_fitted = params_estimated[0] * np.exp(params_estimated[1] * x) + params_estimated[2]
plt.scatter(x, y_noisy, label='Noisy data')
plt.plot(x, y_true, label='True function', linestyle='--')
plt.plot(x, y_fitted, label='Fitted function', color='red')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gauss-Newton Method for Nonlinear Least Squares')
plt.show()
代码说明
- residuals:计算残差函数 ( r(\mathbf{x}) )。
- jacobian:计算雅可比矩阵 ( \mathbf{J} )。
- gauss_newton:实现高斯-牛顿法的主函数。该函数迭代更新参数,直到收敛或达到最大迭代次数。
- 示例数据生成与拟合:生成示例数据并使用高斯-牛顿法进行拟合,最后可视化结果。
结果展示
运行上述代码,可以得到拟合的参数估计值及其与真实值的比较,并通过图形展示拟合效果。
Estimated parameters: [ 2.00731989 -0.99971756  0.50021009]
True parameters: [2, -1, 0.5]

从结果可以看出,高斯-牛顿法能够较准确地估计非线性函数的参数。通过可视化图形,可以直观地看到拟合曲线与真实曲线之间的差异。
结论
高斯-牛顿法是一种强大且常用的非线性最小二乘优化方法。在处理非线性问题时,通过迭代更新参数,高斯-牛顿法可以有效地逼近全局最优解。本文介绍了高斯-牛顿法的原理、推导过程,并通过Python代码展示了如何应用该算法解决实际问题。
希望本文能够帮助您理解和应用高斯-牛顿法。如果您有任何问题或建议,欢迎在评论区留言讨论。


















