MATLAB梯度下降法

梯度下降法

  梯度下降法(英语:Gradient descent)是一个一阶最优化算法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。

梯度

  梯度的矢量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大(为该梯度的模)。

  • 二元函数   z = f ( x , y ) \ z=f(x,y)  z=f(x,y)有连续的一阶导数,则其梯度为:
    g r a d f ( x , y ) = ∂ f ∂ x i ⃗ + ∂ f ∂ y j ⃗ = ( ∂ f ∂ x , ∂ f ∂ y ) grad f(x,y) = \frac{∂ f}{∂ x}\vec{i} + \frac{∂ f}{∂ y}\vec{j}=(\frac{∂ f}{∂ x}, \frac{∂ f}{∂ y}) gradf(x,y)=xfi +yfj =(xf,yf)
    函数在一点沿梯度方向的变化率最大,最大值为该梯度的模。
  • 三元函数   u = f ( x , y , z ) \ u=f(x,y,z)  u=f(x,y,z)有连续的一阶导数,则其梯度为:
    g r a d f ( x , y , z ) = ∂ f ∂ x i ⃗ + ∂ f ∂ y j ⃗ + ∂ f ∂ z k ⃗ = ( ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z ) grad f(x,y,z) = \frac{∂ f}{∂ x}\vec{i} + \frac{∂ f}{∂ y}\vec{j}+\frac{∂ f}{∂ z}\vec{k}=(\frac{∂ f}{∂ x}, \frac{∂ f}{∂ y},\frac{∂ f}{∂ z}) gradf(x,y,z)=xfi +yfj +zfk =(xf,yf,zf)
      则有迭代过程:
    x i + 1 = x i + μ ∂ f ( x i , y i , z i ) ∂ x , y i + 1 = y i + μ ∂ f ( x i , y i , z i ) ∂ y , z i + 1 = z i + μ ∂ f ( x i , y i , z i ) ∂ z x^{i+1} = x^{i}+\mu \frac{∂ f(x^{i},y^{i},z^{i})}{∂ x}, y^{i+1} = y^{i}+\mu \frac{∂ f(x^{i},y^{i},z^{i})}{∂ y}, z^{i+1} = z^{i}+\mu \frac{∂ f(x^{i},y^{i},z^{i})}{∂ z} xi+1=xi+μxf(xi,yi,zi)yi+1=yi+μyf(xi,yi,zi)zi+1=zi+μzf(xi,yi,zi)

同样,该梯度方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

梯度下降法

  梯度下降法是最早最简单,也是最为常用的最优化方法。梯度下降法实现简单,当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢。

  在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

  这里取一个简单的例子

%% 梯度下降法
%牛顿迭代法
function [x,y,n,point] = Tidu(fun,dfunx,dfuny,x,y,EPS,p)
a = feval(fun,x,y);
b = a+1;
n=1
point(n,:) = [x y a];
while (abs(a-b) >= EPS) 
  a = feval(fun,x,y);
  x = x - p*(feval(dfunx,x,y));
  y = y - p*(feval(dfuny,x,y));
  b = feval(fun,x,y); 
  n = n+1;
  point(n,:) = [x y b]; 
end

调用函数:

% 目标函数为 z=f(x,y)=(x^2+y^2)/2
clear all
clc
fun = inline('(x^2+y^2)/2','x','y');
dfunx = inline('x','x','y');
dfuny = inline('y','x','y'); 
x0 = 2;
y0 = 2;
EPS = 0.00001;
p = 0.5;
[x,y,n,point] = Tidu(fun,dfunx,dfuny,x0,y0,EPS,p)
figure
x = -0.1:0.1:2;
y = x;
[x,y] = meshgrid(x,y);
z = (x.^2+y.^2)/2;
surf(x,y,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,4)收敛到(0,0,0))
迭代过程

  • 4
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
梯度下降算法是一种用于优化的迭代算法,常用于求解最小化一个函数的问题。在 MATLAB 中,可以使用以下步骤实现梯度下降算法: 1. 定义目标函数:首先,需要定义一个要最小化的目标函数。这个函数可以是任意的可微函数。 2. 计算梯度:对目标函数求偏导数,得到梯度向量。在 MATLAB 中,可以使用 `gradient` 函数计算梯度。 3. 初始化参数:选择一个初始参数向量,作为梯度下降算法的起点。 4. 迭代更新参数:根据梯度方向和学习率,更新参数向量。重复这个过程直到满足停止准则(比如达到最大迭代次数或梯度接近零)。 5. 返回结果:返回最终的参数向量作为最优解。 下面是一个简单的示例代码,演示了如何在 MATLAB 中实现梯度下降算法: ```matlab % 定义目标函数 function cost = myObjective(x) cost = (x(1) - 2)^2 + (x(2) - 3)^2; end % 计算梯度 function grad = myGradient(x) grad = gradient(@myObjective, x); end % 初始化参数 x0 = [0; 0]; % 设置学习率和迭代次数 learningRate = 0.1; maxIter = 100; % 梯度下降算法 for iter = 1:maxIter % 计算梯度 grad = myGradient(x0); % 更新参数 x0 = x0 - learningRate * grad; % 判断停止准则 if norm(grad) < eps break; end end % 输出最优解 disp('Optimal solution:'); disp(x0); ``` 请注意,这只是一个简单的示例,并且需要根据具体的问题进行适当的修改和调整。梯度下降算法的性能和收敛速度也取决于学习率的选择,因此在实际应用中需要进行调参。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值