自古以来,凡是追求尽善尽美是人类的天性,因而产生了科学,工程,数学,经济和商业等领域的实际问题时,人们欲从众多可行的方案中选择最优或近似最优的解决方案,那么最优化方法就是专门解决这类问题的一个强有力工具。最优化方法包括无约束优化与约束优化,今天我们先来讨论无约束优化理论的基本结构。
本文内容:符号约定
最优性条件:最优解的类型,最优性条件
无约束优化算法的基本结构
python实现精确线搜索
1. 符号约定
梯度向量(列向量)
海森矩阵
2. 最优性条件
(1)最优解的类型全局最优解
若对任意
则称
为最优化问题
的全局最优解。
局部最优解
对
,若存在
,使得对任意的
,当
时,有
。
(2)最优性条件一阶必要条件:
设
为
的一个局部极小值点,则
。二阶必要条件:
设
,
为
的一个局部极小值点,则
半正定。二阶充分条件:
设
,在点
有
,则当
正定时,
为
的严格局部极小点。
3. 无约束优化算法的基本结构
(1)线搜索型方法:
(2)信赖域方法:
(3)线搜索和信赖域方法的比较:相同点:都需要考虑终止准则,下降方向,步长,收敛性与收敛速度。
不同点:线搜索先确定下降方向,再确定步长;信赖域方法则是先划定一个步长范围,然后在这个范围里面选下降方向与步长。
(4)线搜索型的四个要素:终止准则:
或
或
下降方向:(将在具体算法中介绍)
步长:精确线搜索准则,基于区间搜索的步长选择方法,非精确线搜索准则(Armijo准则,Goldstein准则,二次插值,三次插值)
收敛性与收敛速度:收敛性(
),收敛速度:线性收敛(
),二次收敛(
)
(5)步长:精确线搜索准则:
例子:求
的每一步下降步长的表达式?
解:
基于区间搜索的步长选择方法:
(1)均匀搜索法:
把初始区间[a,b]均分成N份,若
,则
(2)0.618法:
(3)二分法:
如果
,则
,反之。非精确线搜索准则(Armijo准则,Goldstein准则,二次插值。三次插值):
(1)Armijo准则:
说明:Armijo准则使用了
的切线控制最大步长,并给定步长的一个上界,但是并没有给出步长的下界(因为下界是0),但是实际中我们不需要过于小的步长,因为过小的步长将导致收敛速度太慢。
(2)Goldstein准则:
(3)二次插值法:(只设定了上限
)
设在0,
两点已知,
,假定在点
处不满足Armijo准则,那么构造二次插值多项式:
,插值点为:
,求出插值系数:
(4)三次插值法(同时设定上限与下限):
设三个点与四个插值数据:
,设置插值多项式:
,最终求解插值系数:
(6)信赖域方法:
在点
,我们想要求下降方向
,我们不可能求解极小化问题
去得到
,因为这与原问题一样复杂。我们采用原函数的二阶近似,采用泰勒展开来简化问题:
原问题:
简化后问题:
求解出第k步的方向后需要对
修正以获得
,修正的依据应该是在
处,
近似
的程度决定的,因此:
的大小反映了在
处,
近似
的程度决定的,当
接近于1时,近似程度好;当
接近于0时,近似程度不好。最后可以输出整个算法!
至于算法为什么取0.75和0.25,是因为查看了作者论文,作者说到了算法对0.75和0.25不敏感。
4. python实现精确线搜索
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
class Optimizer():
# 求函数值f(x) = x^2
# 求导数
# 精确线搜索求步长
# 梯度下降
def __init__(self):
pass
def f_x(self,x):
return x**2
def gradient(self,x):
return 2*x
def alpha (self,x,d_k):
return -x/d_k
def start(self):
x_0 = 100
for i in range(0,5000):
if (self.gradient(x_0)>10**(-8)):
a = self.alpha(x_0,-self.gradient(x_0))
x_new = x_0 - a* self.gradient(x_0)
x_0 = x_new
print(x_0)
else:
break
return (x_0,self.f_x(x_0))
if __name__ == '__main__':
opz = Optimizer()
opz.start()
5. 结语
以上就是最优化理论之无约束优化基本结构及其python应用文章的全部内容,在下一次的分享中,将会给大家带来具体的无约束优化算法,包括最速下降法,牛顿法,拟牛顿法以及共轭梯度法等。《数值最优化方法》--高立
Bilibili 崔雪婷老师的最有化课程