牛顿法与Hessian矩阵

本文介绍了牛顿法的基本原理及其在求解方程根和非线性最优化问题中的应用。通过一阶和二阶泰勒展开公式,详细解释了牛顿法迭代求解的过程,并探讨了其在多变量问题上的扩展,包括Hessian矩阵的作用及拟牛顿法等改进方案。

       牛顿法 主要有两方面的应用:

1. 求方程的根;

2. 求解最优化方法;

一. 为什么要用牛顿法求方程的根?

       问题很多,牛顿法 是什么?目前还没有讲清楚,没关系,先直观理解为 牛顿法是一种迭代求解方法(Newton童鞋定义的方法

        

       假设 f(x) = 0 为待求解方程,利用传统方法求解,牛顿法求解方程的公式:

f(x0+Δx) = f(x0) + f′(x0) Δx

即 f(x) = f(x0) + f′(x0) (x-x0)

       公式可能大家会比较熟悉,一阶泰勒展式,f′(a) 表示 f(x) 在 x0 点的斜率 (这个很好理解),当X方向增量(Δx)比较小时,Y方向增量(Δy)可以近似表示为 斜率(导数)*X方向增量(f′(x0) Δx) ,令 f(x) = 0我们能够得到 迭代公式:

x = x0 - f(x0) / f′(x0)    =>   xn+1 = xn - f(xn) / f′(n)

       通过逐次迭代,牛顿法 将逐步逼近最优值,也就是方程的解。

二. 扩展到最优化问题

       这里的最优化 是指非线性最优化,解非线性最优化的方法有很多,比如 梯度下降法、共轭梯度法、变尺度法和步长加速法 等,这里我们只讲 牛顿法

       针对上面问题进行扩展:

       解决 f(x) = 0 的问题,我们用了一阶泰勒展开

f(x) = f(x0) + f'(x0)*(x-x0) + o( (x-x0)^2 )

           去掉末位高阶展开项,代入x = x0+Δx,得到:

f(x) = f(x0+Δx) = f(x0) + f′(x0) Δx

       那么 要解决 f′(x) = 0 的问题,我们就需要二阶泰勒展开

f(x) = f(x0) + f'(x0)*(x-x0) + 0.5*f''(x0)*(x-x0)^2 + o( (x-x0)^3 )

           去掉末位高阶展开项,代入x = x0+Δx,得到:

f(x) = f(x0+Δx) = f(x0) + f′(x0)Δx + 0.5 * f′′(x0) (Δx)^2

       求导计算: f′(x) = f'(x0+Δx) = 0,得到:

 [ f(x0) + f′(x0)(x−x0) + 0.5 f′′(x0)(x−x0)^2 ]′ = 0

       整理:

 f′(x0) + f′′(x0)(x−x0) = 0

x = x0 − f′(x0) / f′′(x0)   =>  xn+1 = xn - f'(xn) / f'′(xn)

       牛顿法 一图总结为:

        


三. 牛顿法 与 Hessian矩阵的关系

       以上牛顿法的推导 是针对 单变量问题,对于多变量的情况,牛顿法 演变为:

        

      与上面的单变量表示方式类似,需要用到变量的 一阶导数 和 二阶导数

      其中 J 定义为 雅克比矩阵,对应一阶偏导数。

        

      H 为 Hessian矩阵,对应二阶偏导数

        

       网上也能搜到类似的公式表达,也列出来:

        

       牛顿法 在多变量问题上仍然适用迭代求解,但Hessian矩阵的引入增加了复杂性,特别是当:

▪ Hessian 矩阵非正定(非凸)导致无法收敛;

▪ Hessian 矩阵维度过大带来巨大的计算量。

       针对这个问题,在 牛顿法无法有效执行的情况下,提出了很多改进方法,比如 拟牛顿法(Quasi-Newton Methods)可以看作是牛顿法的近似。

       拟牛顿法 只需要用到一阶导数,不需要计算Hessian矩阵 以及逆矩阵,因此能够更快收敛,关于 拟牛顿法 这里不再具体展开,也有更深入的 DFP、BFGS、L-BFGS等算法,大家可以自行搜索学习。

       总体来讲,拟牛顿法 都是用来解决 牛顿法 本身的 复杂计算、难以收敛、局部最小值等问题。

### 使用高斯牛顿法进行Hessian矩阵拟合 #### 方法概述 在优化问题中,尤其是非线性最小二乘问题,高斯牛顿法是一种常用的数值方法。该方法通过迭代方式逐步逼近最优解,在每一步迭代过程中构建并求解一个局部线性化模型。 对于给定的目标函数 \( f(\mathbf{x}) \),其残差向量记作 \( \mathbf{r}(\mathbf{x}) \),则目标是最小化平方误差之和: \[ S(\mathbf{x}) = \frac{1}{2}\sum_{i=1}^{m} r_i^2 (\mathbf{x}) \] 为了简化计算复杂度,高斯牛顿法采用了一阶泰勒展开来近似原函数,并假设可比矩阵 \( J \) 是常数[^1]。具体来说,Hessian矩阵被替换为可比矩阵的转置其自身的乘积: \[ H \approx J^\top J \] 这种处理方式不仅降低了计算成本,还提高了算法效率。然而需要注意的是,这种方法的有效性和准确性依赖于初始猜测的质量以及问题本身的特性[^2]。 #### 实现细节 以下是使用Python实现的一个简单例子,展示了如何利用高斯牛顿法来进行参数估计: ```python import numpy as np def gauss_newton(x0, residuals_func, jacobian_func, max_iter=50, tol=1e-8): """ 高斯牛顿法实现 参数: x0 : 初始参数值 residuals_func : 计算残差的函数 jacobian_func : 计算克比矩阵的函数 max_iter : 最大迭代次数,默认50次 tol : 收敛容忍度,默认1e-8 返回: 优化后的参数 """ x = x0.copy() for _ in range(max_iter): # 计算当前点处的残差和各比矩阵 r = residuals_func(x) J = jacobian_func(x) try: delta_x = np.linalg.solve(J.T @ J, -(J.T @ r)) if np.allclose(delta_x, 0, atol=tol): break x += delta_x except np.linalg.LinAlgError: print("遇到奇异矩阵或病态情况") break return x ``` 此代码片段定义了一个名为`gauss_newton` 的函数,它接受四个主要输入:起始参数 `x0`, 残差计算函数 `residuals_func`, 可比矩阵计算函数 `jacobian_func` 和其他一些控制选项如最大迭代次数 (`max_iter`) 及收敛标准(`tol`). 函数内部实现了基本的高斯牛顿迭代逻辑,包括检查是否遇到了可能导致不收敛的情形(例如奇异矩阵),并通过适当调整参数直到满足终止条件为止.
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值