NG机器学习总结-(三)线性回归以及python实现

在前面已经简单介绍了回归问题(预测房价),其实在统计学中,线性回归(Linear Regression)是利用被称为线性回归方程的最小平方函数(Cost Function)对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数式一个或多个被称为回归系数的模型参数的线性组合。----此话出自《统计学习》一书,个人觉得定义的有点拗口。个人见解,线性回归其实是通过一个线性模型来找出自变量和因变量之间的关系,依我们以前的老板看来其实就是y = ax + b。当只有一个自变量的时候就是单变量线性回归(Linear Regression with one variable),当自变量是多个的时候就是多变量线性回归。

一、单变量线性回归

在NG机器学习总结-(二)中已经介绍了单变量线性回归的模型表示、损失函数以及梯度下降求解,这里不再重复介绍,只是简单将其拿出来复习一下。

1.模型表示

NG机器学习总结-(三)线性回归以及python实现

2.损失函数

NG机器学习总结-(三)线性回归以及python实现

3.梯度下降算法求解

repeat until convergence {

       NG机器学习总结-(三)线性回归以及python实现  

}

根据上式求解:

NG机器学习总结-(三)线性回归以及python实现

NG机器学习总结-(三)线性回归以及python实现

update NG机器学习总结-(三)线性回归以及python实现NG机器学习总结-(三)线性回归以及python实现 simultaneously

二、多变量线性回归

上面说到多变量线性回归(Linear Regression with mutiple variable)其实就是自变量(特征,features)是多个。假设还是以预测房价为例,以前只有一个自变量(房子的大小,特征是Size),这里假设房价不仅受房子的大小(Size)还受到房间的数量(bedroom)和房子的楼层(floor)以及房子的年限(years)影响,这里就有四个自变量(特征)。

NG机器学习总结-(三)线性回归以及python实现

这就是一个多变量线性回归问题。因此我们可以构建如下的线性回归模型:

NG机器学习总结-(三)线性回归以及python实现

当然有的时候特征变量也会有很多,比如10个、20个、50个等。为了方便以后的表述,这里给出数据集的一些符号。

  • m表示数据集(训练集)中样本的数量
  • n表示自变量(特征)的数量
  • NG机器学习总结-(三)线性回归以及python实现表示训练集中第i个样本输入
  • NG机器学习总结-(三)线性回归以及python实现表示训练集中第i个样本中第j个特征

对照单变量线性回归以及上面给出的例子,下面会介绍线性回归的模型一般表示、损失函数以及梯度下降求解。

1.模型表示

同样的根据单变量线性回归的模型表示,可以得出多变量线性回归的模型表示:

NG机器学习总结-(三)线性回归以及python实现

这里NG机器学习总结-(三)线性回归以及python实现可以表示为房子的大小(特征)、NG机器学习总结-(三)线性回归以及python实现表示为为房间的数量、NG机器学习总结-(三)线性回归以及python实现表示为房子的位置等等。而相对应的NG机器学习总结-(三)线性回归以及python实现NG机器学习总结-(三)线性回归以及python实现NG机器学习总结-(三)线性回归以及python实现等等可以表示为对应特征的参数。NG机器学习总结-(三)线性回归以及python实现可以简单理解为房子的基础价。

一般为了方便编程,我们会采用矩阵的方式用来简化多变量线性回归模型:

NG机器学习总结-(三)线性回归以及python实现

2.损失函数

同样的根据单变量线性回归,为了减小预测值和真实值之间的差距,我们的目标就是选择出使得模型的误差最小的模型参数,这里仍然使用误差平方和来表示,其损失函数如下:

NG机器学习总结-(三)线性回归以及python实现

3.梯度下降算法求解

repeat until convergence {

       NG机器学习总结-(三)线性回归以及python实现  

}

根据上式求解:

NG机器学习总结-(三)线性回归以及python实现

NG机器学习总结-(三)线性回归以及python实现

NG机器学习总结-(三)线性回归以及python实现

...

NG机器学习总结-(三)线性回归以及python实现

update NG机器学习总结-(三)线性回归以及python实现,NG机器学习总结-(三)线性回归以及python实现.,...,NG机器学习总结-(三)线性回归以及python实现 simultaneously

In other words:

repeat until converagence:{

        NG机器学习总结-(三)线性回归以及python实现

}

三、特征缩放和学习速率

1.特征缩放(feature scaling)

从刚刚的房价预测数据我们取两个特征,一个是房子的大小(size),另一个是房间的数量(num of bedrooms),明显看出房子的大小的取值范围是0-2200,而房间的数量取值是1-5,两者的数值差距很大。我们在NG学习总结-(二)中已经画过特征参数和损失函数的等高线图,这里我们以特征参数NG机器学习总结-(三)线性回归以及python实现(size)和特征参数NG机器学习总结-(三)线性回归以及python实现(number of bedrooms),简化等高线图如下(NG的课程里面这个size假设是0-2000不要受上面数据集的影响):

NG机器学习总结-(三)线性回归以及python实现

从上图可以看出如果不同特征之间的取值范围差距过大,在使用梯度下降算法的过程中会造成损失函数收敛到最小值的速度太慢。因此为了加速损失函数的收敛,我们会将不同的特征取值范围粗略的处理成范围相近的取值。这里我们给出一种方法是:NG机器学习总结-(三)线性回归以及python实现,通过这种方式,得出的每个特征的取值的范围大约会在[-1,1]之间。比如刚刚的房价预测中房子的大小(size)和房间的数量(number of bedrooms),经过这种方式处理后,可以得出下面的等高线图:

NG机器学习总结-(三)线性回归以及python实现

经过这种方式的特征缩放后,收敛的速度会快很多(没有明确定义所有的特征值一定要严格在[-1,1]之间,比如原来的数据集中某一项特征的取值范围是[0.5-2]之间这样也是可以的,各个特征的取值范围接近即可)。另外一种方式是标准化(mean normalization)这是一种使用比较多的特征缩放方法,其计算方式如下:NG机器学习总结-(三)线性回归以及python实现,这里的NG机器学习总结-(三)线性回归以及python实现是指各项特征的取值的平均值。通过这种方式,特征缩放后的取值一般是[-0.5,0.5]的范围内。

2.学习速率

我们知道梯度下降算法的求解公式如下:

NG机器学习总结-(三)线性回归以及python实现

但是我们怎么确定在梯度下降算法的求解过程中一定是正确的呢?换一句话说每次的迭代参数都应该会使损失函数减小,那我们怎么确保这个过程是正常的,这个时候需要去检测。如果给定搞一个有效的学习速率NG机器学习总结-(三)线性回归以及python实现,那么经过每一次迭代,特征参数都能降低损失函数的值,这个过程应该就是正确的,至少可以说每一次迭代损失函数有收敛到最小值的趋势。(当经过一次迭代后,如果损失函数的值减小了小于0.001,那么我们可以认为是收敛了。)

NG机器学习总结-(三)线性回归以及python实现

下面会给出几种梯度下降过程中的异常情况。

NG机器学习总结-(三)线性回归以及python实现

比如第一种情况(上图中左上角图),这说明梯度下降算法的过程不正确,(在确保你程序写的正确的情况下)说明可能学习速率取值太大(对应右下角图);第二种情况(上图中左下角图),这说明可能学习速率NG机器学习总结-(三)线性回归以及python实现取值太大,导致了波动。这个时候需要调整学习速率。学习速率是一个很重要的值,如果学习速率取值太小,收敛太慢;如果学习速率取值太大,每一次迭代损失函数不一定会减小,甚至不会收敛(当然也会导致收敛很慢)。那么如何选取一个合适的学习速率呢?NG课程中表示这个时候需要去进行多次的实验来尝试,比如取值可以是...,0.001,...,0.01,...,0.1,...,通过实验来找到合适的学习速率。

四、多项式回归

对于刚刚提到的房价预测问题,现在假设有两个自变量(特征),一个是房子的宽度(frontage)NG机器学习总结-(三)线性回归以及python实现,一个是房子的长度(depth)NG机器学习总结-(三)线性回归以及python实现,因此我们可以建立的房价预测模型为:

NG机器学习总结-(三)线性回归以及python实现

但是我们换一个角度思考,这其实可以用房子的面积(size)NG机器学习总结-(三)线性回归以及python实现作为自变量(特征)来预测房价(NG机器学习总结-(三)线性回归以及python实现),因此我们可以建立的房价预测模型为:

NG机器学习总结-(三)线性回归以及python实现

当然这仍然是一个线性回归模型,但是并不是所有的问题都可以用线性模型来拟合数据集,比如下面的数据集:

NG机器学习总结-(三)线性回归以及python实现

如果用线性模型去拟合数据,明显效果是不好的。但是如果我们同时用曲线1和曲线2去拟合数据,我们发现曲线1在对称轴的右方会有下降的趋势,这种拟合也是不合理的,而曲线2明显很好的拟合数据集。曲线1和曲线2的模型表示为:

曲线1的模型表示:NG机器学习总结-(三)线性回归以及python实现

曲线2的模型表示:NG机器学习总结-(三)线性回归以及python实现

====》NG机器学习总结-(三)线性回归以及python实现

上面提到的两种模型分别是二次函数和三次函数,因此这些被称为多项式回归模型。通过将特征的转化,我们可以将多项式回归问题转化为了线性回归模型求解(这个时候特征缩放就会很重要的,根据上图右下角的绿色字体,可以看出特征取值之间差距很大)。当线性模型不能很好的拟合数据集的时候,选取合适的特征,将其转化为了多项式模型就显得很重要了,当然这里的多项式模型并不仅限于上面给出的模型,你也可以使用NG机器学习总结-(三)线性回归以及python实现,你还可以使用不同特征之间的组合(NG机器学习总结-(三)线性回归以及python实现 等)。

五、标准方程

1.标准方程

无论是单变量线性回归和多变量线性回归问题,我们都是使用梯度下降算法来找出使得损失函数最小的时候的特征参数NG机器学习总结-(三)线性回归以及python实现。我们先来观察损失函数的表示:

NG机器学习总结-(三)线性回归以及python实现

NG机器学习总结-(三)线性回归以及python实现

NG机器学习总结-(三)线性回归以及python实现   (当预测值等于真实值) NG机器学习总结-(三)线性回归以及python实现

这其实不就是多元方程组嘛?中学的时候我们就学过怎么求解多元方程组,因此当:NG机器学习总结-(三)线性回归以及python实现的时候我们可以解出所有的参数值。这里我们用矩阵来表示数据集:

NG机器学习总结-(三)线性回归以及python实现

损失函数等同于:

NG机器学习总结-(三)线性回归以及python实现

根据标准方程对其进行参数求导:

NG机器学习总结-(三)线性回归以及python实现

求得参数解:

NG机器学习总结-(三)线性回归以及python实现

如果学过矩阵相关的知识,我们会发现NG机器学习总结-(三)线性回归以及python实现并不一定会存在可逆矩阵,比如特征之间的关系不独立(某两个特征之间可能存在某种比例换算关系)、或者当特征的数量大于训练集的数量的时候。因此当你想要使用标准方程的时候一定要考虑一下两个点:

  • 确定是否有相关特征,如果存在相关特征,则去掉相关特征
  • 当特征数量较多的时候,可以去掉一些不重要的特征(特征选择方法)

2.标准方程和梯度下降算法比较

梯度下降算法的优势:

  • 当特征的数量比较大时(特征的数量超过10000),也能够很好的实现损失函数最小化,同时时间复杂度不是很高;而当特征的数量比较大时,使用正规方程求解逆运算是非常耗时的,所以此时使用梯度下降法比较合适。 
  • 梯度下降法适用于所有类型的模型,而正规方程的方法一般只适用于线性模型,不适合逻辑回归等其他模型。

标准方程的优势:

  • 当特征点的数量不是很大时,使用正规方程更加简单,不需要像梯度下降算法一样迭代实现,一次计算就可以得出最优参数。 
  • 对于梯度算法来说,性能的好坏还与学习率的设置有关,学习率设置不合适,时间消耗较长,甚至得不到最优解,而正规方程的方法不需要学习率的设置

六、python代码实现线性回归

由于线性回归和逻辑回归python的实现方式很相似,只是少量的代码修改,这里将python实现线性回归和逻辑回归放在另一篇博客,并用逻辑回归算法在实际的数据集来预测病马的死亡率。

参见:Python实现线性回归和逻辑回归