梯度下降算法

梯度 & 梯度下降算法


先看下定义比较合适:
在向量微积分中,标量场的梯度是一个向量场。标量场中某一点上的梯度指向标量场增长最快的方向梯度的长度是这个最大的变化率。

    一个标量函数的梯度记为:或者
    表示微分算子。
    在三维直角坐标系中为:
    
     在单变量的情况下,梯度只是个导数,对于一个线性函数,梯度就是个斜率。
    梯度下降算法是一个最优化算法,通常也称为最速下降法。顾名思义:沿着梯度下降的方向求解最小值,或者沿着梯度上升的方向求解最大值。

迭代的公式为:

其中代表梯度负方向,表示梯度方向的搜索步长。

梯度方向可以通过对函数求导得到。
因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0,而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数值。


话说到这里,一般情况下就该举个例子了。

———————————下边是例子————————————————————-
求函数的最小值
利用梯度下降法解题步骤:
1. 求梯度,
2. 向梯度相反的方向移动,其中为步长。如果步长足够小,则可以保证每一次迭代都在减小,但可能导致收敛太慢,但是如果步长太大的话,则不能保证每一次迭代都减少,也不能保证收敛。
3. 循环迭代步骤2,知道的值变化到使得在两次迭代之间的差值足够小,比如0.000000001,也就是说,知道两次迭代计算出来的基本没有变化,则说明此时已经达到局部最小值。
4. 此时,输出,这个就是使得函数最小时的取值。
MATLAB演示代码如下:

%%梯度下降法
%设置步长为0.1,f_change为改变前后的y值的变化,仅设置了一个退出条件。
function tidu=tidu()
syms x;f=x^2;
step=0.1;x=2;k=0;%设置步长,初始值,迭代记录数
f_change=x^2; %初始化差值
f_current=x^2 ; %计算当前函数值
ezplot(@(x,f)f-x^2);%画出函数图像
axis([-2,2,0,4]);  %固定坐标值
hold on
while f_change>0.000000001
x=x-step*2*x;%-2x为梯度反方向,step为步长
f_change=f_current-x^2;%计算两次函数值之差
f_current=x^2;%重新计算当前的函数值
plot(x,f_current,'ro','markersize',7)%标记当前位置
drawnow;pause(1.0);
k=k+1;
end
hold off
fprintf('在迭代%d次后找到函数最小值为%e,对应的x值为%e\n',k,x^2,x);
end  

运行效果如下:http://pan.baidu.com/s/1qYaLFq8

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值