机器学习(一)梯度下降算法

一 梯度下降算法理论知识

梯度下降算法分为批度下降算法和随机下降算法。批度下降算法遍历全部数据适合高维数据的处理,但计算速度慢。随机梯度下降算法每次只对一个样本进行训练。所以计算速度较快,但是由于选取的样本少不一定是梯度下降最快的地方,所以可能得不到局部最优值。此外基于这两种算法衍生出了一些改进的算法,比如小批量梯度下降算法。

梯度下降算法是基于最小均方误差准测进行计算的,主要的推导过程如下图所示

二 梯度下降算法matlab代码实现

数据下载

2.1批量梯度下降算法

此段代码的功能是根据年龄预测身高。属于监督学习

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('训练数据', '线性回归')%标记每个数据设置

2.2 随机梯度下降算法

运行后可以发现最大迭代次数已经增加到了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('训练数据', '线性回归')

2.3小批量梯度下降算法

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('训练数据', '线性回归')

猜你喜欢

转载自blog.csdn.net/qq_24163555/article/details/86545871