梯度下降算法

2017-12-27  本文已影响0人  zoulala

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


直接上例子:

函数: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)));

```

上一篇下一篇

猜你喜欢

热点阅读