C语言实现最优化牛顿法,最优化-使用导数的最优化方法

牛顿法

需求:知道每个点的一阶导数和二阶倒数(Hessian矩阵)

目标:

若x*是无约束问题的局部解,则x*满足 ▽f(x) = 0

▽f(x) 表示多元函数对其中每一元求偏导数组成的向量

▽f(x) = (∂f/∂x1, ∂f/∂x2, ∂f/∂x3, .......)

过程:

对于多元函数▽f(x)我们在初始点x1做线性展开得到

▽f(x) = ▽f(x1) +  ▽2f(x1) (x-x1)

将▽f(x) = 0 代入

解出x2 = (▽f(x) - ▽f(x1))  * ▽2f(x1)-1 + x1

x2即为下一个迭代点, 当迭代到达到精度要求时,结束迭代

当然,如果知道更高阶的倒数的话,也可以使用泰勒展开做近似,一般应用场景中只使用到二阶导数

优点:

算法具有二次终止性,收敛较快

缺点:

迭代过程中,函数值可能不是严格下降的

当初始点与正解距离较大时,迭代点列可能不收敛

要计算Hessian矩阵的逆矩阵,计算量较大

Hessian矩阵要是不可逆就凉了

修正牛顿法

需求: 同牛顿法

目标:

解决牛顿法中函数值可能上升的问题

过程:

解线性方程组

9ec0ff3d794496217f7c1e04078112e0.png

d为f(x)的收敛方向,为线性近似中的xk到0点的梯度

在xk处,方向d上做精确一维搜索,搜索到的点即为下一个迭代点

当xk处导数的范数小于精度要求时,终止迭代

优点:

解决了牛顿法中函数值上升的问题

对收敛在鞍点的情况有所改善

共轭梯度法

引入:

对于正定二次函数

a8e1dc4a1c5da42d849d27d237c2a8df.png,其函数图像是一个超球面

对于n维超球面,我得出n个正交方向

沿着这些正交方向做n次精确一维搜索即可得到最优解

对于一般的二次函数

7dc4fd8ddf51d7912f50cc304c8c17af.png

将其做一个变换改变为正定二次函数就能解决问题了

下面就引入变换

5ff68dd937d109c54ee546f36fba475c.png

29584b37d675692939086d1770cde89d.png

这样就改造成了正定二次函数

接下来就是要找在w下的n个正交方向了q

因为对于这n个正交方向,在一遍的空间中有

a172c10bc52df28e594380c50d3bac7f.png

所以

ebbf7aa4b67a753c92ff2496f1640ad9.png

那么我们将d1, d2称作共轭方向(G必须要对称正定)

可以看到当G = I时,共轭方向就是正交方向

过程

可以知道,共轭梯度法的过程就是去找n个共轭梯度,然后去做精确一维搜索就好

afbbdfd3bcd324fe5572a0fa2f32a861.png

进行一维搜索,得到x2

0c172a72a2967c56450cfd12af5aa19b.png(个人认为,这是为了找到一个离梯度最近的共轭方向,所以才这么做的)

679e602db4c469e70eefb98b13c2bc7a.png

7dcf7451767cfb29545bb68e059863f1.png

每一步这样迭代下去即可

当▽f(x) <= 精度要求时,终止迭代

可以看到,在计算梯度时我们还是用了G

进行一系列化简之后得到下式

4b4782e6b3bd355f8b825548ea0bbb9a.png

dk = -▽f(xk) + βk-1 * dk-1

βk-1 = || f(xk) ||2  / || f(xk-1) ||2

优点:

不用二阶导,计算量减小

算法的名称

PRP算法

881429696e6e9ec72bac57776c05f635.png

FR算法

02c302f77416a0357bf18ec2e495c103.png

变度量法(大概率不考)

主要思想

使用▽f(x)的泰勒展开式去获取Hessin矩阵的近似值

▽f(x) = ▽f(x0) +  ▽2f(x0) * (x - x0)

具体算法

(很不走心的直接贴书上的图

2e3926ed2efee23186a59a297c0d1420.png

cee80b6224c9b10627f297eae6e43b63.png

b01034aba29791de73214a81e5890891.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值