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



相关文章
|
机器学习/深度学习 数据可视化 Python
逻辑回归那些事—使用牛顿法解决实际问题
逻辑回归是机器学习中的重要章节,本文将带你从公式推导到算法实现详细讲述这部分内容,想学习这个高大上的技能么,快来看吧!!!
5493 0
逻辑回归那些事—使用牛顿法解决实际问题
|
4月前
|
机器学习/深度学习
|
6月前
|
算法
梯度下降算法(二)
梯度下降法中,学习率选择至关重要。0.3的学习率导致无法找到最小值且产生震荡,而0.01则使结果接近最优解(2.99998768)。当学习率进一步减小至0.001,点远离最低点。通过迭代次数增加至1000次,可更接近最低点(2.999999999256501)。梯度下降用于最小化损失,学习率控制参数更新步长,需平衡收敛速度和稳定性。迭代次数和初始点也影响模型性能,合适的初始化能加速收敛并避开局部极小值。
|
6月前
|
机器学习/深度学习 存储 算法
梯度下降算法(一)
梯度下降是一种迭代优化算法,用于找到多变量函数的最小值。它不直接求解方程,而是从随机初始点开始,沿着梯度(函数增大幅度最大方向)的反方向逐步调整参数,逐步逼近函数的最小值。在单变量函数中,梯度是导数,而在多变量函数中,梯度是一个包含所有变量偏导数的向量。通过计算梯度并乘以学习率,算法更新参数以接近最小值。代码示例展示了如何用Python实现梯度下降,通过不断迭代直到梯度足够小或达到预设的最大迭代次数。该过程可以类比为在雾中下山,通过感知坡度变化来调整前进方向。
|
7月前
|
机器学习/深度学习 算法 调度
多元线性回归梯度下降法
梯度下降法是一种通用的优化算法,尤其适用于机器学习中找到最优解。与解析解法不同,它不局限于特定情况,能在数据规模较大时依然有效。该方法通过迭代逐步接近最优解,每次迭代利用损失函数的梯度信息调整参数。学习率是控制参数更新幅度的关键因素,太大会导致发散,太小则收敛慢。全量梯度下降每次使用所有样本更新,收敛稳定但速度慢;随机梯度下降每次仅用一个样本,速度快但可能产生较大波动;小批量梯度下降取两者之间,以一定的样本批量进行更新,兼顾速度和稳定性。
83 1
|
7月前
|
算法 Python
梯度下降法
梯度下降法
77 0
|
算法 异构计算
连载|梯度下降
连载|梯度下降
|
机器学习/深度学习 算法 搜索推荐
导数、梯度、最优化方法|学习笔记
快速学习导数、梯度、最优化方法
169 0
导数、梯度、最优化方法|学习笔记
|
机器学习/深度学习 存储 算法
导数、梯度、最优化方法|学习笔记
快速学习导数、梯度、最优化方法
导数、梯度、最优化方法|学习笔记
|
算法 数据可视化 数据挖掘
梯度下降【无约束最优化问题】(二)
本文属于 线性回归算法【AIoT阶段三】(尚未更新),这里截取自其中一段内容,方便读者理解和根据需求快速阅读。本文通过公式推导+代码两个方面同时进行,因为涉及到代码的编译运行,如果你没有NumPy,Pandas,Matplotlib的基础,建议先修文章:数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解),本文是梯度下降的第一部分,后续还会有:三种梯度下降方法与代码实现,梯度下降优化,梯度下降优化进阶 (暂未更新)
139 0
梯度下降【无约束最优化问题】(二)