机器学习基础---多变量线性回归

一:多维特征

目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(X_1,X_2,...,X_n)

每一行都是一个训练集样本。

二:多元梯度下降法

与单变量线性回归类似,在多变量线性回归中,我们也构建一个代价函数,则这个代价函数是所有建模误差的平方和。

我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。 多变量线性回归的批量梯度下降算法为:

即:

当n>=1时:

 

我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。

代价函数代码实现:

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

三:梯度下降法实践---特征缩放

在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。

以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,主要下降方向在数值较大方向,梯度下降算法需要非常多次的迭代才能收敛。

解决的方法是尝试将所有特征的尺度都尽量缩放到-11之间。如图:

另外:对于范围在-1到1的范围附件,我们可以不进行归一化处理。但是对于差距较大(过大或者过小),则需要进行归一化处理。

两种常用的归一化操作(均值标准化和标准差标准化):https://blog.csdn.net/luckoovy/article/details/82346223

相似范围即可,其主要目的是为了使得梯度下降速度加快

四:梯度下降法实践---学习率α

(一)根据图表查看是否收敛

梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。

可以看到,在300-400之间的下降并不是很大,明显趋于收敛。

也有一些自动测试是否收敛的方法,也就是说让一种算法,来告诉你梯度下降算法是否已经收敛。如果代价函数J(θ)一步迭代后的下降小于一个很小的值ε,这个测试九判断函数以及收敛。ε可以是1e-3。通常要选择一个合适的阈值ε是相当困难的。因此,为了检查梯度下降算法是否收敛,通常看上图表更好。而不是依靠自动收敛测试。 

例如将代价函数的变化值与某个阀值(例如0.001)进行比较,但通常看上面这样的图表更好。

(二)并且通过看图,我们可以知道算法有没有正常工作,是否正常收敛:

 1.J(θ)实际上在不断上升,则梯度下降算法没有正常工作。---针对这样曲线图,我们应该使用较小的学习率α

如果学习率太大,可能导致并不会在每次迭代之后都下降,甚至导致发散。

如果J(θ)在上升,最常见的原因是:我们在尝试最小化时,选取的学习率α过大,导致最小化时,冲过最小值,一直增加,得到越来越大的代价值J(θ)

当我们获取了上面的代价函数图表,一般也是因为我们选取了较大的学习率α。解决方法依旧是减少学习率。

2.如果学习率过小,则达到收敛所需的迭代次数会非常高。

3.通常可以考虑尝试些学习率:

应该选取一系列α值,直到找到一个太小的值比如0.03,再找到一个太大的值1,然后选取最大可能值,或者比最大值略小一些的比较合理的值。通常我们就可以获取一个不错的学习率。

五:特征和多项式回归

(一)选择新的特征的方法

了解一些用来选择特征的方法以及如何得到不同的学习算法,当选择了合适的特征后,这些算法往往是非常有效的。

了解多项式回归,使得我们能够使用线性回归的方法来拟合非常复杂的函数 甚至是非线性函数。

如房价预测问题:假设你有两个特征,分别是房子临街的宽度和垂直宽度

运用线性回归时,你不一定非要直接用给出的 x1 和 x2 作为特征,可以自己创造新的特征。

因此 如果我要预测房子的价格,我真正要需做的,也许是确定真正能够决定我房子大小的因素是什么?是我们拥有土地的大小

因此 我可能会创造一个新的特征,我称之为x(拥有的土地大小) 它是临街宽度与纵深的乘积:

于是我们将下面这个式子作为假设,只用一个特征(上面式中x),也就是我的土地的面积 

因此,这取决于我们从什么角度去看一个特定的问题,不是直接去使用临街宽度和纵向深度。这两个我们只是碰巧在开始时使用的特征,有时 通过定义新的特征,确实会得到一个更好的模型

(二)与选择特征的想法密切相关的一个概念被称为多项式回归

比方说:你有这样一个住房价格的数据集

为了拟合它,可能会有多个不同的模型供选择。比如上面的数据集,我们选择不同的多项式模型:可以使用二次函数(后面下降),或者三次函数(后面上升)进行拟合。

线性回归并不适用于所有数据,有时我们需要曲线来适应我们的数据,比如一个二次方模型:

或者三次方模型:

那么我们如何将模型与数据进行拟合?

通常我们需要先观察数据然后再决定准备尝试怎样的模型。使用多元线性回归的方法 我们可以通过将我们的算法做一个非常简单的修改来实现它。按照我们以前假设的形式 ,我们知道如何对这样的模型进行拟合,如下图所示:

仅仅通过将这三个特征这样设置 :

然后再应用线性回归的方法,我们就可以拟合这个模型:

最终将一个三次函数拟合到我的数据上。

注意:如果我们向上面选择特征:

那么特征缩放就变得更加重要了:

因为这三个特征的范围有很大不同,因此特征缩放非常重要。这样才能将值的范围变得具有可比性。

补充:除了二次,三次函数可以拟合模型数据集之外,我们还可以使用:

来拟合数据,因此,对于一个数据集,我们可以存在多种模型进行数据拟合。

补充:我们可以自由选择使用什么样的特征和模型,并且通过设计不同的特征,我们可以使用更复杂的函数拟合数据。后面课程会学习到一些算法,他们可以自动选择使用什么样的特征,所以可以让算法观察给出的数据,并自动为我们选择模型函数。

六:正规方程

(一)正规方程了解

对于某些线性回归问题,用标准方程法(正规方程)求解参数θ的最优值更好。

到目前为止,我们一直在使用的线性回归的算法,是梯度下降法。

梯度下降法,为了最小化代价函数 J (θ),我们使用的迭代算法,需要经过很多步,也就是说通过多次迭代来计算梯度下降,来收敛到全局最小值。

相反地,标准方程法提供了一种求θ的解析解法,所以与其使用迭代算法,我们可以直接一次性求解θ的最优值,所以说基本上,一步就可以得到优化值,标准方程法有一些优点,也有一些缺点。

但是在我们讲解这个和何时使用标准方程之前,让我们先对这个算法有一个直观的理解。

我们假设 有一个非常简单的代价函数J(θ),它就是一个实数θ的函数。所以现在假设θ只是一个标量,或者说θ只有一行。它是一个数字,不是向量。假设我们的代价函数J,是这个实参数θ的二次函数。 所以J (θ)如上图所示。

那么如何最小化一个二次函数呢?最小化的一个函数的方法是对它求导 ,并且将导数置零,就能求得θ值

当θ不是一个标量,而是一个n+1维的参数向量时,如何求解?就是对每个θ_j求导,然后把他们全部置零。

但实际上如果你真的做完微积分和求解参数θ0到θn,这个偏微分最终可能很复杂。

(二)案例讲解

假如说我有m=4个训练样本:

在我的训练集中加上一列对应额外特征变量的x0,就是那个取值永远是1的。

其中X是一个M*(n+1)维矩阵,y会是一个m维向量。其中m是训练样本数量,n是特征变量数。n+1是因为我加的这个额外的特征变量x0。

最后,如果你用矩阵X和向量y来计算θ:

这样就得到能够使得代价函数最小化的θ。

对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),正规方程方法是不能用的。

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

总结一下,只要特征变量的数目并不大,标准方程是一个很好的计算参数的替代方法。具体地说,只要特征变量数量小于一万,我通常使用标准方程法,而不使用梯度下降法

随着我们要讲的学习算法越来越复杂,例如,当我们讲到分类算法,像逻辑回归算法,我们会看到,实际上对于那些算法,并不能使用标准方程法。对于那些更复杂的学习算法,我们将不得不仍然使用梯度下降法。因此,梯度下降法是一个非常有用的算法,可以用在有大量特征变量的线性回归问题。或者我们以后在课程中,会讲到的一些其他的算法,因为标准方程法不适合或者不能用在它们上。但对于这个特定的线性回归模型,标准方程法是一个比梯度下降法更快的替代算法。所以,根据具体的问题,以及你的特征变量的数量,这两种算法都是值得学习的。

(三)推导过程

补充:矩阵求导

(四)代码实现

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

七:正规方程及不可逆性

posted @ 2020-04-27 21:23  山上有风景  阅读(1026)  评论(0编辑  收藏  举报