梯度下降算法
梯度下降是一种优化算法(无约束的非线性规划)。自己结合例子总结如下。
直接上例子:
函数: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)));