梯度下降算法原理详解及MATLAB程序代码(最简单)

模型就是线性规划及线性规划的对偶理论,单纯形法以及它的实际应用:整数规划及其解法(分支定界法、割平面法匈牙利算法Q),目标规划非线性规划动态规划决策分析等等。

其它的一些优化算法。比如说一维搜索里面的黄金分割法加步探索法牛顿法抛物线法等算法求函数的最优解。再后面还有无约束问题的最优化方法,约束问题的最优化方法这两个非常重要的内容。那么在无约束问题的优化算法中,最让人耳熟能详也可能是应用最广泛的就数最速下降法(也叫梯度下降法) 、牛顿法、共梯度法了。在约束问题的优化算法中主要涉及K-T条件,可行方向法、制约函数法。这些算法在当今的机器学习领域应用还是十分广泛的。

梯度下降迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

1、算法步骤:梯度下降算法原理详解及MATLAB程序代码(最简单)_第1张图片

梯度下降算法原理详解及MATLAB程序代码(最简单)_第2张图片

2、MATLAB例程:

2.1 主函数(main)

% 目标函数为 z=f(x,y)=(x^2+y^2)/2
clear all
clc
fun = inline('(x^2+y^2)/2','x','y');  % 函数(x^2+y^2)/2'
dfunx = inline('x','x','y');          %对x的导数
dfuny = inline('y','x','y');          %对y的导数
x0 = 2;               % 初始位置
y0 = 2;
Epsilon1 = 0.00001;   % 精度
Lambda1 = 0.5;        % 步长/更新率

%求解
[x,y,n,point] = Tidu(fun,dfunx,dfuny,x0,y0,Epsilon1,Lambda1)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% figure 画图
x = -0.1:0.1:2;
y = x;
[x,y] = meshgrid(x,y);
z = (x.^2+y.^2)/2;
surf(x,y,z)    %绘制三维表面图形
xlabel('X');ylabel('Y');zlabel('z')

% hold on
% plot3(point(:,1),point(:,2),point(:,3),'linewidth',1,'color','black')
hold on
scatter3(point(:,1),point(:,2),point(:,3),'r','*');

2.2 调用函数(function)

%% 梯度下降法
%牛顿迭代法
function [x,y,n,point] = Tidu(fun,dfunx,dfuny,x,y,Epsilon,Lambda)
a = feval(fun,x,y);
b = a+Epsilon+0.1; % 初始化差值,这里是为了保证while语句第一次执行时判断正确进入循环
n=1;
point(n,:) = [x y a];  % 记录每一次迭代的x,y,函数f的值
while (abs(a-b) > Epsilon || abs(a-b) == Epsilon )   % 判断
% while (abs(a-b) >= Epsilon ) 
  a = feval(fun,x,y);
  x = x - Lambda*(feval(dfunx,x,y)); % 更新x,p=0.5是步长,后边是梯度0.5x
  y = y - Lambda*(feval(dfuny,x,y)); % 更新y,p=0.5是步长,后边是梯度0.5y
  b = feval(fun,x,y); 
  n = n+1;
  point(n,:) = [x y b]; 
end
end

2.3 结果

梯度下降算法原理详解及MATLAB程序代码(最简单)_第3张图片

x =
   9.7656e-04
y =
   9.7656e-04
n =
    12
point =
    2.0000    2.0000    4.0000
    1.0000    1.0000    1.0000
    0.5000    0.5000    0.2500
    0.2500    0.2500    0.0625
    0.1250    0.1250    0.0156
    0.0625    0.0625    0.0039
    0.0313    0.0313    0.0010
    0.0156    0.0156    0.0002
    0.0078    0.0078    0.0001
    0.0039    0.0039    0.0000
    0.0020    0.0020    0.0000
    0.0010    0.0010    0.0000

结果表明迭代了n=12次后,到达了极小值点(9.7656e-04,9.7656e-04),极小值为9.5367e-07

你可能感兴趣的:(matlab,算法,机器学习)