梯度下降算法

梯度下降算法

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

直接上例子:

函数: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 测试代码


%%

%梯度下降算法(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://my.oschina.net/u/3851199/blog/1941659

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值