matlib实现梯度下降法

简介: 样本文件下载:ex2Data.zipex2x.dat文件中是一些2-8岁孩子的年龄。ex2y.dat文件中是这些孩子相对应的体重。我们尝试用批量梯度下降法,随机梯度下降法和小批量梯度下降法来对这些数据进行线性回归,线性回归原理在:http://www.

样本文件下载:ex2Data.zip

ex2x.dat文件中是一些2-8岁孩子的年龄。

ex2y.dat文件中是这些孩子相对应的体重。

我们尝试用批量梯度下降法,随机梯度下降法和小批量梯度下降法来对这些数据进行线性回归,线性回归原理在:http://www.cnblogs.com/mikewolf2002/p/7560748.html

1.批量梯度下降法(BGD)

BGD.m代码:

clear all; close all; clc;
x = load('ex2x.dat'); %装入样本输入特征数据到x,年龄
y = load('ex2y.dat'); %装入样本输出结果数据到y,身高
figure('name','线性回归-批量梯度下降法');
plot(x,y,'o') %把样本在二维坐标上画出来
xlabel('年龄') %x轴说明
ylabel('身高')  %y轴说明

m = length(y); % 样本数目
x = [ones(m, 1), x]; % 输入特征增加一列,x0=1
theta = zeros(size(x(1,:)))'; % 初始化theta

MAX_ITR = 1500;%最大迭代数目
alpha = 0.07; %学习率
i = 0;
while(i<MAX_ITR)
   grad = (1/m).* x' * ((x * theta) - y);%求出梯度
   theta = theta - alpha .* grad;%更新theta
   if(i>2)
       delta = old_theta-theta;
       delta_v = delta.*delta;
       if(delta_v<0.000000000000001)%如果两次theta的内积变化很小,退出迭代
           break;
       end
   end
   old_theta = theta;
   i=i+1;
end
i
theta
predict1 = [1, 3.5] *theta
predict2 = [1, 7] *theta
hold on
plot(x(:,2), x*theta, '-') % x现在是一个2列的矩阵
legend('训练数据', '线性回归')%标记每个数据设置
View Code


image

程序输结果如下:迭代次数达到了上限1500次,最后梯度下降法求解的theta值为\([0.7502,0.0639]^T\),两个预测值3.5岁,预测身高为0.9737米,7岁预测为1.1973米。

注意学习率的选择很重要,如果选择太大,可能不能得到收敛的\(\theta\)值

i =

        1500


theta =

    0.7502
    0.0639


predict1 =

    0.9737


predict2 =

    1.1973
View Code

2.随机梯度下降法

sgd.m代码如下,注意最大迭代次数增加到了15000,1500次迭代不能得到收敛的点,可见随机梯度下降法,虽然计算梯度时候,工作量减小,但是因为不是最佳的梯度下降方向,可能会使得迭代次数增加:

clear all; close all; clc;
x = load('ex2x.dat');
y = load('ex2y.dat');
figure('name','线性回归-随机梯度下降法');
plot(x,y,'o')
xlabel('年龄') %x轴说明
ylabel('身高')  %y轴说明
m = length(y); % 样本数目
x = [ones(m, 1), x]; % 输入特征增加一列
theta = zeros(size(x(1,:)))';%初始化theta

MAX_ITR = 15000;%最大迭代数目
alpha = 0.01;%学习率
i = 0;
while(i<MAX_ITR)
   %j = unidrnd(m);%产生一个最大值为m的随机正整数j,j为1到m之间
   j = mod(i,m)+1;
   %注意梯度的计算方式,每次只取一个样本数据,通过轮转的方式取到每一个样本。
   grad =  ((x(j,:)* theta) - y(j)).*x(j,:)';
   theta = theta - alpha * grad;
   if(i>2)
      delta = old_theta-theta;
      delta_v = delta.*delta;
      if(delta_v<0.0000000000000000001)
          break;
      end
   end
   old_theta = theta;
   i=i+1;
end
i
theta
predict1 = [1, 3.5] *theta
predict2 = [1, 7] *theta
hold on
plot(x(:,2), x*theta, '-')
legend('训练数据', '线性回归')
View Code

image

程序结果输出如下:

i =

       15000


theta =

    0.7406
    0.0657


predict1 =

    0.9704


predict2 =

    1.2001
View Code

3.小批量梯度下降法

mbgd.m代码如下,程序中批量的样本数目,我们选择5:

clear all; close all; clc;
x = load('ex2x.dat');
y = load('ex2y.dat');
figure('name','线性回归-小批量梯度下降法')
plot(x,y,'o')
xlabel('年龄') %x轴说明
ylabel('身高')  %y轴说明
m = length(y); % 样本数目

x = [ones(m, 1), x]; % 输入特征增加一列
theta = zeros(size(x(1,:)))'; %初始化theta

MAX_ITR = 15000;%最大迭代数目
alpha = 0.01;%学习率
i = 0;
b = 5; %小批量的数目
while(i<MAX_ITR)
   j = mod(i,m-b)+1;
   %每次计算梯度时候,只考虑b个样本数据
   grad = (1/b).*x(j:j+b,:)'*((x(j:j+b,:)* theta) - y(j:j+b));
   theta = theta - alpha * grad;
   if(i>2)
      delta = old_theta-theta;
      delta_v = delta.*delta;
      if(delta_v<0.0000000000000000001)
          break;
      end
   end
   old_theta = theta;
   i=i+b;
end
i
theta
predict1 = [1, 3.5] *theta
predict2 = [1, 7] *theta
hold on
plot(x(:,2), x*theta, '-')
legend('训练数据', '线性回归')
View Code

image

程序的输出结果:

i =

       15000


theta =

    0.7418
    0.0637


predict1 =

    0.9647


predict2 =

    1.1875
View Code



相关文章
|
XML 编解码 前端开发
【web组件库系列】封装自己的字体图标库
【web组件库系列】封装自己的字体图标库
399 0
|
2月前
|
安全 Cloud Native Serverless
2025数字员工技术选型白皮书:阿里云/亚马逊等5款产品云原生能力实测
本文深度评测阿里云、亚马逊、科大讯飞、玄晶引擎、安恒五款数字员工,围绕架构兼容性、开发友好度、性能稳定性三大维度,结合实测数据与企业案例,为开发者提供选型指南与避坑建议。
363 5
|
4月前
|
人工智能 安全 搜索推荐
AI的下一个前沿:从静态工具到动态代理
AI的下一个前沿:从静态工具到动态代理
296 113
|
7月前
|
数据可视化 数据管理 BI
如何用二维码搭建一套会议和活动报名系统
本文介绍了如何利用二维码技术高效管理会议报名与签到流程。相比传统方式,二维码具有低成本、便捷、数据统计准确等优势,适用于小型内部会议、中型公开讲座及大型行业论坛等多种场景。通过草料二维码平台,用户可轻松创建报名表单、配置规则、生成二维码,并支持线上线下多渠道推广。系统还提供实时数据统计、现场签到核销功能,帮助组织者提升活动管理效率。文章还分享了应对现场突发情况的实用技巧,为活动组织者提供全面参考。
|
6月前
|
JSON API 数据格式
小红书笔记详情API,json数据返回
以下是一个模拟的小红书笔记详情的JSON数据返回示例,包含了笔记的基本信息、作者信息、内容、图片、标签以及互动数据(点赞、评论、收藏)等关键字段:
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
存储 安全 大数据
阿里云存储:优缺点深度剖析
阿里云存储是国内领先的云存储服务,具备高效稳定、弹性可扩展、安全可靠及丰富的产品线等优点,适用于各种规模的企业。其分布式架构支持高并发和大数据处理,提供多层次的安全防护和灵活的存储方案。然而,成本较高、数据安全风险和网络连接稳定性等问题也需关注。用户应根据需求权衡利弊,选择合适的存储方案。
1203 74
|
10月前
|
传感器 网络协议 物联网
《分布式软总线:重塑应用开发工作量格局》
分布式软总线是一种颠覆性技术,显著简化了跨设备应用开发。它通过自发现、统一接口封装和连接资源管理,融合Wi-Fi、蓝牙等通信技术,让设备自动识别与连接,无需开发者深究底层细节。其异构组网能力支持多设备灵活拓扑,传输功能满足多种数据需求。相比传统模式需耗费大量时间处理底层代码与适配问题,分布式软总线大幅减少工作量,使开发者能专注于业务逻辑优化,提升效率、降低成本,推动跨设备协同应用进入高效智能新时代。
322 3
|
机器学习/深度学习 自然语言处理 语音技术
迁移学习(Transfer Learning)
迁移学习是一种机器学习技术,通过将一个任务中学到的知识应用于另一个相关任务,有效解决了数据稀缺和计算资源有限的问题。它涉及预训练模型、特征提取、微调、领域适应等多种技术,广泛应用于计算机视觉、自然语言处理等领域,显著提升了模型的泛化能力和新任务的性能。
|
弹性计算 小程序 Android开发
使用无影云电脑玩《黑神话·悟空》游戏教程,无需下载,开机即玩!
本教程详细介绍如何利用阿里云无影云电脑轻松畅玩《黑神话·悟空》游戏,无需下载游戏客户端,开机即可体验。首先需下载无影客户端并购买个人铂金款云电脑(14.9元首月)。购买后,通过输入WeGame版或Steam版镜像分享码并选择电竞模式来配置云电脑。最后,在云电脑中启动WeGame客户端并登录账户,手动添加游戏路径后即可游玩。注意游戏需单独购买,并记得游玩后关闭云电脑以避免额外计费。更多详情与步骤请参阅阿里云官方指南。