美文网首页
梯度下降算法

梯度下降算法

作者: zoulala | 来源:发表于2017-12-27 14:14 被阅读0次

    梯度下降是一种优化算法(无约束的非线性规划)。自己结合例子总结如下。


    直接上例子:

    函数:f(x) = x1-x2+2x1^2+2x1x2+x2^2,是一条曲线

    看起来舒服点

    求使得函数f(x)为最小值时的点(x1,x2),即目标函数:minf(x)

    解: 

    1、随机给定初始点 x=(0,0)

    1代表第一个点,接下来2、3..为下一个点

    2、f(x)的梯度为点的偏导(切线方向是最大方向):

    3、初始点的偏导:

    4、搜索放向:(负梯度方向)

    5、计算步长入:

    下一个点为x = x + 入d =(-入,入),代人f(x)=入^2-2入,其最小值时的入为最优步长入

    6、计算下一个点:x = x + 入d


    附图:

    请忽略图片的字丑

    - matlab 测试代码

    ```matlab

    %%

    %梯度下降算法(gradient descent)

    %说明:对一个二元多项式进行求最小值(x1,x2)——>min(fn)

    %时间:2016-01-04

    %作者:zlw

    %%

    clc;clear;close all;

    syms x1 x2 r;

    fn=x1-x2+2*x1^2+2*x1*x2+x2^2;%定义函数

    %exmp:fn0=subs(fn,{x1,x2},{1,2});%计算(1,2)处的函数值

    dfn1=diff(fn,x1);%求x1偏导

    dfn2=diff(fn,x2);%求x2偏导

    e=0.000001;%误差范围

    x_next=[0,0];%初始给定点

    for k=1:10000

        t1(k)=x_next(1);t2(k)=x_next(2);

        dfn=[subs(dfn1,{x1,x2},{t1(k),t2(k)}),subs(dfn2,{x1,x2},{t1(k),t2(k)})];%计算该点的偏导

        d=-dfn;

        if d*d'<=e

            x_min=[t1(k),t2(k)];%输出最优点

            break;

        else

            x_temp=[t1(k),t2(k)]+r*d;

            yr=subs(fn,{x1,x2},{x_temp(1),x_temp(2)});

            dyr=diff(yr,r);

            r_min=double(solve(dyr,r));  %(求最优步长r)导数为0时的r值,solve求等式方程很强大

            x_next=[t1(k),t2(k)]+r_min*d;

        end

    end

    disp('最小值点(x1,x2)为:');

    disp(x_min);

    disp('最小值为:')

    disp(double(subs(fn,{x1,x2},x_min)));

    ```

    相关文章

      网友评论

          本文标题:梯度下降算法

          本文链接:https://www.haomeiwen.com/subject/lgxugxtx.html