文章目录
前言
无约束问题的求解过程一般都是通过一系列的一维搜索来实现,搜索方向的不同,形成了不同的最优化方法。这篇文章从最速下降法入手,来进行搜索。
一、最速下降法介绍
最速下降法又叫梯度法,通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代,其过程刚好与最速下降法相反,所以在求解最大值的优化问题时,常常将目标函数加负号之后,转变为求最小值后,使用最速下降法来求解。
二、最速下降法原理
最速下降法是使用负梯度方向
来作为搜索的方向。设f(x)在Xk附近 可微,dk为搜索方向,gk为梯度方向,有Taylor公式可知:
而由导数的定义可知:Xk在沿着搜索方向下降的变化为
当搜索方向与梯度方向的夹角为π时,下降的变化最小,所以负梯度方向是目标函数在已知点的最速下降方向。
三、最速下降法步骤
- 给定初始点x(0),设置允许误差ε
- 计算初始点的导数,确定搜索方向
- 判断梯度范数与允许误差的大小
- 若梯度范数大于允许误差,则进行一维搜索,否则停止搜索,得到最优解。
- 进行迭代计算
- 迭代次数更新:k=k+1
- 转步骤(2)继续进行后续搜索,直至得到局部最优解。
四、最速下降法代码
function [k, ender]=fun(f,x,e)%最速下降法,f为目标函数
syms x1 x2 m;%x1、x2为变量,m为步长
d=-[diff(f,x1);diff(f,x2)];%分别求x1和x2的偏导数,组合为梯度
flag=1;%循环标志
k=0;%迭代次数
while(flag)
d_temp=subs(d,x1,x(1));%将起始点代入,求得当次下降x1梯度值
d_temp=subs(d_temp,x2,x(2));%将起始点代入,求得当次下降x2梯度值
nor=norm(d_temp);%范数
if(nor>=e)
x_temp=x+m*d_temp;%改变初始点x的值
f_temp=subs(f,x1,x_temp(1));%将改变后的x1和x2代入目标函数
f_temp=subs(f_temp,x2,x_temp(2));
h=diff(f_temp,m);%对m求导,求出最佳步长
m_temp=solve(h);%求方程,得到当次m
x=x+m_temp*d_temp;%更新起始点x
k=k+1;%迭代次数增加
else
flag=0;
end
end
ender=double(x);%搜索的终点
end
五、最速下降法测试
测试以二元函数发f(x1,x2)=2*x1^2 + x2^2为例:
syms x1 x2;
f=2*x1^2+x2^2;
e=0.1;
x=[1;1];[k,ender]=fun(f,x,e)
k =3
ender =-0.00820.0329
经过三次迭代,误差小于允许误差,最终最优解在(-0.0082,0.0329)处取得。
总结
在有限的迭代次数内,只能得到局部最优解,不一定能够取得真正的最优解,而且最速下降法是根据梯度来进行迭代,所以搜索的的实际曲线是锯齿形的曲线,越接近到最优解的点,下降的速度越缓慢。
版权归原作者 Ali.s 所有, 如有侵权,请联系我们删除。