【MindSpore:跟着小Mi一起机器学习吧!】多变量线性回归(二)


几天不见,甚是想念!小Mi系列的活动正在如火如荼地进行中,小Mi看到大伙儿的热情,动力更加十足,这不又迫不及待地更新来了!

在上期的多变量线性回归介绍中,我们学习了多维特征、多变量的梯度下降法以及在实现梯度下降过程中的特征缩放和如何选择学习率这两个技巧,今天小Mi在其基础上,继续带领大家学习多项式回归、正规方程法以及介绍正规方程的不可逆性。好啦,废话不多说啦,我们继续开始吧!

5 特征和多项式回归

依旧是以预测房价为例,假设我们有两个特征,分别是房子临街的宽度和垂直宽度。这就是我们想要卖出的房子的图片,临街宽度其实就是你拥有的土地的宽度,而这所房子的纵向深度就是你的房子正面的宽度(定义为长度这样可能更好理解一点),因此我们便有两个特征,临界宽度和纵深,这样我们就可以建立一个线性回归模型,其中临界宽度是第一个特征,纵深是第二个特征。这里需要注意的是,当运用线性回归时,不一定非要用给出的作为特征,换个角度我们还可以自己创造新的特征!(是不是脑洞大开!)因此,如果要预测房子的价格,小Mi可能会创造一个新的特征,可以称之为,即临界宽度与纵深的乘积,也就是房屋的面积,这样一来就只会用到一个特征:

这边小Mi需要提醒大家注意的是,有时候不一定需要直接使用临界宽度和纵深,这两个我们一开始使用的特征,有时通过定义新的特征,你可能会得到一个更好的模型。

就拿上图来说,有这样一个住房价格的数据集,可能会有多个不同的模型用于拟合,选择之一是可能是二次模型,因为直线似乎并不能很好地拟合这些数据。用二次模型去拟合,但是最后发现可能二次函数似乎也有点不合理。因为,一个二次函数最终会降下来,随着土地面积的增加,房子的价格必然不会下降下来。那么小Mi又选择使用三次方的函数,进行数据拟合发现,上图中绿色的线对这个数据集拟合得更好,因为它不会在最后下降。

观察曲线图我们可以知道,通常情况下线性回归并不会适用于所有数据,有时我们需要曲线方程来适应我们的数据。那么,我们又应该如何将模型与数据进行拟合呢?使用多元线性回归的方法,我们可以对算法做一个简单的修改来实现它,按照我们之前假设的形式,我们知道如何拟合,就像这样:

如果我们想拟合这个三次模型,因为是预测一栋房子的价格,那么对应起来,特征设为房子的面积,第二个特征设为房屋面积的平方,将第三个特征设为房屋面积的立方,仅仅通过将这三个特征这样设置,然后再应用线性回归的方法就可以拟合这个模型。需要留意的是,如果房子的大小范围在1~100之间,那么房子面积的平方的范围就是1~1000,而第三个特征,立方的范围则是1到10的6次方,因此这三个特征的范围有很大的不同,这时如果使用梯度下降法,特征缩放将会非常重要。

6 正规方程 

到目前为止,在涉及线性回归算法时我们通常会选用梯度下降法来最小化代价函数。使用迭代算法,经过梯度下降的多次迭代,来收敛到全局最小值。然而在面对某些线性回归问题时,正规方程法可能是一个更好的方法来帮助我们求得参数的最优值。总的来说,其提供了一种求的解析方法,不需要运行迭代算法,而是可以直接一次性地求解的最优值,所以说基本上只需要一步就可以得到最优值。(是不是很简单粗暴!)

那么现在小Mi带大家先对这个算法有一个直观的理解,上例子!

假设有一个非常简单的代价函数,其实就是关于实数的函数(只是一个标量或者说只是一个实数值,是一个数字,并不是向量哦)。假设代价函数是这个实参数的二次函数,那么如何最小化一个二次函数呢?这个问题应该大家都会解决,是不是!这时候只需要对J求关于的导数,并且将导数置零,这样就可以求出使得最小的值。

当然在实际情况中,并不是一个实数,而是一个n+1维的参数向量。而代价函数则是这个向量的函数,也就是的函数,这时候我们应该如何最小化这个代价函数呢?实际上,有一个方法能做到,就是逐个对参数求J的偏导数,并且把他们全部置零,求出,...,一直到的值,这样就能得到最小化代价函数J的值。但是如果真的手动求解出参数,这个偏微分最终可能很复杂,这样不仅浪费时间还很费事。如何求出使得代价函数最小化的值这个过程是需要了解的。

再上一个例子!假如有4个训练样本:

为了实现正规方程法,在数据集中,假设这四个训练样本是所有数据,在数据集中需要加上一列对应额外特征变量的,它的取值永远是1。接下来我们要做的就是构建一个矩阵X,这个矩阵基本包含了训练样本所有的特征变量,同时对y值进行类似的操作,构建向量y。

即:

运用正规方程方法求解参数:

通常情况来看,我们可以知道X是一个m*(n+1)维矩阵,y会是一个m维向量,其中m是训练样本数量,n是特征变量数,由于我们多加了一列额外特征变量,所以其实是n+1维。最后,用矩阵X和向量y来计算,从而得到的解:

X转置乘以X的逆乘以X转置乘以向量y,这样就能够得到使得代价函数最小化的

而就是更加通用的形式为:假设我们有m个样本,一直到和n个特征变量。所以每一个训练样本可能是这样的一个向量,是n+1维的。每个训练样本给出这样的n+1维特征向量,构建设计矩阵X的方法就是取第一个训练样本,也就是一个向量,取它的转置,最后是一个扁长型的,让转置作为矩阵X的第一行,然后把第二个训练样本进行转置,作为X的第二行,以此类推,直到最后一个训练样本取它的转置,作为矩阵X的最后一行,这就是矩阵X,一个m*(n+1)维矩阵。

举个例子:

假如我只有一个特征变量,除了之外只有一个特征变量,而始终为1,如果我的特征向量等于某个实际的特征变量,比如说房屋大小,那么我的X会是这样:,这样就是一个m*2的矩阵。而向量y则是把训练集中所有房子的价格放在一起,得到一个m维的向量。最后,构建出矩阵X和向量y,就可以求出结果

那么,如果具体求出这个结果呢?的逆矩阵,令A等于X转置乘以X,那么就是,可以借助编程语言计算这个值。这样的式子会给出最优的值而不需要进行特征缩放,即使特征的范围相差很大。

最后,何时应该使用梯度下降法,而何时应该使用正规方程法,给大家进行一个总结,假如有m个训练样本,n个特征变量,梯度下降法的缺点之一就是需要选择学习速率,并且需要运行多次,尝试不同的学习速率,直到找到运行效果最好的那个,所以这会有额外的工作和麻烦,梯度下降的另一个缺点是,需要更多次的迭代,这需要取决于具体情况,计算可能会更慢。至于正规方程,不需要选择学习速率,这样就比较方便,并且容易实现,只需要运行一步就行了,同时也不需要迭代,所以不需要画出的曲线来检测收敛性或者其他额外的工作。这么一看,似乎正规方程法会更受欢迎,但是我们需要重视的是,正规方程法也有一些缺点。梯度下降法中,在特征变量很多的情况下,也可以正常工作,即使有上百万个特征变量,梯度下降法通常很有效果,相反,正规方程法为了求解参数,需要求出这一项,这个结果是一个n*n的矩阵,如果有n个特征变量的话。而对于大多应用来说,实现逆矩阵计算的代价以矩阵维度的三次方增长,大致为n的三次方,所以如果特征变量数目n特别大的话,那么这个计算会非常浪费时间,速度上会慢很多。因此,如果n很大的情况下,我们更倾向于选择梯度下降法,当然啦,如果n比较小的话,那么正规方程就是更优选择。那么,如何定义大小呢?这里需要说明一下,如果n是上百的,计算百位数乘以百位数的逆矩阵,对于计算机来说是没有任何问题的,如果n是上千的,还是可以使用正规方程法的,但是当n上万了,就需要考虑梯度下降法了,当然也不完全绝对,但是当n远大于此,就一定是选用梯度下降法了。这里我们也很难给出确切的数字,到底特征数量应该达到多少时,需要选用梯度下降法,正常来看就是在一万左右,可以选用梯度下降或者其他算法,

因此,只要特征变量的数目并不大,正规方程是一个很好的计算参数的替代方法,但是随着我们需要学习的学习算法越来越复杂,例如当涉及分类算法的时候,logistic回归算法时,正规方程是不太适用的,仍然需要使用梯度下降法。因此,梯度下降法是一个非常有用的算法,在有大量特征的线性回归问题中,在更加复杂的学习算法中,但是对于线性回归的这个特定的模型,正规方程在小样本的特征变量下,是一个比梯度下降实现更快的替代算法。所以,根据具体的算法,具体的问题,以及特征变量的数目,这两个算法都是值得学习和深入研究的。

梯度下降与正规方程的比较:

正规方程的python实现: 

xxxxxxxxxx
import numpy as np
    
 def normalEqn(X, y):
    
   theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等价于X.T.dot(X)
    
   return theta

好啦,至此,小Mi已经把线性回归的所有问题带着大家一起学习啦,下期我们将开始着手学习新的学习算法。我们下期见哦~