【机器学习】机器学习(一、二):批梯度下降法、随机/增量梯度下降法、最小二乘法

前言:

STANFORD机器学习公开课第1、2课(Andrew Ng主讲),本文记录学习过程,整理学习笔记,并将MATLAB代码共享,以便回顾。

简介:

本节介绍机器学习中常用的线性回归模型,鉴于是第一节,为循序渐进的学习,本节中将分析一元线性回归。

假设这里存在m组数据(x,y),其具体值如下(此处m=6):

yx
1.371.15
2.41.9
3.023.06
3.064.66
4.226.84
5.427.95


直接这样给出数据,并不太直观,下面是MATLAB会出的点,横坐标是x,纵坐标是y,如图所示:


        从图上我们可以看出,大致数据的大致走势是可以用线性模型y=kx+b来表示的,为此我们建立一维线性回归模型。假设一维线性模型表达式如下,用n表示输入特征数,为方便计算,所有的样本都加入了x0=1这个特征,所以维数为n+1维。

   

        式中:θ为待求解参数

        误差函数如下表示,其中m为数据组数,即样本个数:


        到此为止,前期工作做完。

        现在要来求解θ的值,求解规则是:所有样本值的误差平方总和最小。在Andrew Ng的讲解中,有三种方法可以求得参数值:批梯度下降法、随机/增量梯度下降法、最小二乘法

①最小二乘法

        最小二乘法的严格推导就不推了,这里举一个通俗的例子,这是一个线性代数中常见的线性方程组,将其展开来看如下:


       其中要求解的参数是β。若矩阵A是方阵,则;但是若A不是方阵,而是mx(n+1)的矩阵,则有如下做法:


        这样就可以解除所有的参数了;由于一维线性回归同属于此类线性方程组问题,故同理可知:


        由于最小二乘法的规则是求解最好的θ值,使误差平方和达到最小。在上式中,我们用y替换hθ (x),也就是说令hθ (x)=y,此时的误差肯定是最小的,说明此时的θ值是最好的。

        故:

 (这个式子可由严格的数学推导得出)

        x矩阵,y矩阵如下,其中下标i表示第i个特征,上标j表示第j个样本:


根据以上分析,其MATLAB代码如下:

%最小二乘法线性拟合
clear all;
close all;
%%
%载入数据
load x.mat;
load y.mat;
%%
m=size(x,1);%样本数
n=size(x,2);%特征维数
theta=((x'*x)\x')*y;%参数拟合
figure;
plot(x(:,2),y,'r.');%原始数据
hold on;
y=theta'*x';%拟合数据
plot(x,y);
for i=1:n
    fprintf('theta%d=%f;\n',i-1,theta(i,1));%打印估计的参数
end
%完
参数输出:

拟合效果(显然误差不为0,也就是说上面对最小二乘法的理解并不严格):

②批梯度下降法


式中α是学习速率,值太大可能导致不收敛;太小收敛得慢。正如上式,对等式右边第二项的求导过程如下:


由此可得(其中j为第j个样本):


根据上式,MATLAB代码如下:

%批梯度下降法
clc;
clear all;
close all;
load x.mat;
load y.mat;
n=size(x,2);%特征维数
m=size(x,1);%样本个数
alpha=0.001;
theta=zeros(n,1);%参数初始化为0向量
for k=1:10000
    for j=1:m
        for i=1:n
            theta(i,1)=theta(i,1)-alpha*(x(j,:)*theta-y(j,1))*x(j,i);
        end
    end
end
figure;
plot(x(:,2),y,'r.');%原始数据
hold on;
y=theta'*x';%拟合数据
plot(x(:,2),y);
for i=1:n
    fprintf('theta%d=%f;\n',i-1,theta(i,1));%打印估计的参数
end
%完
参数输出:


输出结果:

③随机/增量梯度下降法

        在中,讲解了批梯度下降法,代码中可以发现,每一个样本都要遍历所偶的特征,若样本个数m很大,特征n也很大(机器学习中很常见),那么批梯度下降法处理起来效率会较低。为此有一种改进的方法即随机/增量梯度下降法。

随机/增量梯度下降法的推导与上一模一样,只是在代码中做了改动。直接上MATLAB代码(注意理解同时更新theta值的含义):

%随机/增量度下降法
clear all;
close all;
load x.mat;
load y.mat;
figure;
plot(x(:,2),y,'r.');
n=size(x,2);%特征维数
m=size(x,1);%样本个数
alpha=0.01;%下降速度
theta=zeros(n,1);%参数
t=theta;
for iteration=1:1000%迭代次数
    for i=1:n
        t(i,1)=theta(i,1)-alpha*x(:,i)'*(x*theta-y);
    end
    theta=t;%同时更新theta值
end
figure;
plot(x(:,2),y,'r.');
hold on;
y=theta'*x';
plot(x(:,2),y);
for i=1:n
    fprintf('theta%d=%f;\n',i-1,theta(i,1));%打印估计的参数
end
%完
输出参数:

输出结果:

小结:

到此,三个算法都讲解完毕,若有不妥和个人理解有误的地方,请大家多多指正。

本文所需要的实验数据及代码都已打包上传:http://download.csdn.net/detail/hujingshuang/8750323


  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值