梯度下降学习

1、微分实现的代码
主要是使用微分的定义来实现偏微分的功能,
代码如下:
%% 参数为微分的步长x,要微分的点的坐标

function Out = My_diffun(x,y,dilta)

df_div_dx = (My_dif(x+dilta,y)- My_dif(x,y))/dilta;
df_div_dy = (My_dif(x,y+dilta)-My_dif(x,y))/dilta;

Out = [df_div_dx;df_div_dy];
end

My_diffun(x,y,dilta)函数实现部分的代码很简单,看下面(名字起乱了,大家不要看名字,看逻辑就好了大笑)
%% 函数名称为My_dif
%% 定义函数传入的参数是x和y的取值范围分别是-5<=x<=0;-5<=y<=0
function out = My_dif(x,y)
cosx = cos(x);%构造cosx函数点阵
siny = sin(y);%构造siny
a= 1-cosx;
b=1-siny;
c=x-y;
out = siny.*exp(a.^2)+cosx.*exp(b.^2)+c.^2;
end

接下来就是梯度下降法的核心思想了
看:
/———————分割线分割线分割线分割线———————————/
%% 初始化函数x和y
clear all;
clc;
dailta1 = 0.0000001;%设置微分的精度
gama = 0.01;%设置步长
[x,y]=meshgrid(-5:0.1:0);
%% 构造z的点阵
z = My_dif(x,y);
%% 绘制函数的三维图
figure;
mesh(x,y,z);
hold on;
%% 梯度下降法
ii=0;
jj=0;
zz=0;
z0 = My_dif(ii,jj);
df=My_dif(ii,jj);
for aa = -5:1:0
for bb =-5:1:0
ii=aa;
jj=bb;
while abs(df)>=0.01 %&& ii<=0&& ii>=-5 && jj<=0&&jj>=-5
difout = My_diffun(ii,jj,dailta1);%这个时候的偏微
dxdy = -(gama.*difout);
**ii = ii + dxdy(1);
jj = jj + dxdy(2);
df = My_dif(ii,jj)-z0;
z0 = My_dif(ii,jj);
plot3(ii,jj,z0,’pr’);**
zz=zz+1;
end
df = 1;
end
end
主要的思想就是梯度下降法的核心公式,数学公式很重要,算法不仅仅是实现功能的一种固定的步骤,还有就是数学中蕴含的哲学思想。
眼见为实,看效果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值