2-线性回归

2-线性回归

单变量线性回归

例子引入

以房屋价格预测这一单变量线性回归问题为例,简单说明机器学习。

给定房屋面积和实际售出价格数据集。训练算法使能够预测给定房屋面积后房屋的售出价格。

数据集

一个训练数据集包含多个样本。

房屋数据集大致如下:

房屋面积(平方)房屋售出价格(千元)
2104460
1416232
1534315
852178

定义一些数学符号:

  • m:样本数量,即上述数据集中行的数量
  • x:表示输入变量或输入特征
  • y:表示输出变量或目标变量

使用(x, y)来表示样本。表示特定数据样本使用(x(i),y(i))(x^{(i)}, y^{(i)})表示某一特定样本,上标i表示样本索引。即第i个样本。

例如在上述数据集中,x(1)=2104,y(1)=460\boldsymbol{x^{(1)} = 2104, y^{(1)} = 460}

流程

image-20220826150045889

其中h表示假设(hypothesis)函数,该函数由学习算法得出。

表示假设函数h

hθ(x)=θ0+θ1xh_{\theta}(x) = {\theta}_0 + {\theta_1}x,也可简写为h(x)h(x)

它是预测y关于变量x的线性函数。

这种模型被称为线性回归。

更具体来说,可称为单变量线性回归,因为仅有x一个输入变量。

代价函数

假设函数中θ0{\theta}_0θ1{\theta}_1称为模型参数。

image-20220826150833395

将给定的数据集画到坐标系中,通过调整两个模型参数尽可能拟合出符合数据点的线性函数。

评价拟合的效果使用方差,即:

12mi=1m(hθ(x(i))y(i))2\frac{1}{2m} \sum_{i=1}^{m}( h_{\theta}(x^{(i)}) - y^{(i)} )^2

其中,除以m可以使整个数变小从而减小误差,2则是为了方便后续的计算。

因此引入代价函数,具体定义为:

J(θ0,θ1)=12mi=1m(hθ(x(i))y(i))2J({\theta_0}, {\theta_1}) = \frac{1}{2m} \sum_{i=1}^{m}( h_{\theta}(x^{(i)}) - y^{(i)})^2

代价函数又称为平方误差代价函数,代价函数是解决回归问题最常用的手段。

通过求得代价函数的最小值,就能求得最佳的模型参数θ0{\theta}_0θ1{\theta}_1

求最小值

首先将问题简化为θ0=0{\theta_0} = 0

即假设函数为h(x)=θ1x{h(x) = {\theta_1}x},代价函数为J(θ1)=12mi=1m(hθ(x(i))y(i))2J({\theta_1}) = \frac{1}{2m} \sum_{i=1}^{m}\left ( h_{\theta}(x^{(i)}) - y^{(i)} \right )^2

假设有三个数据样本:(1, 1), (2, 2), (3, 3)

通过给定参数θ1{\theta_1}不同的值,可以计算出不同的代价函数值。绘制下图:

image-20220826154519415

由图可知,当θ1=1{\theta_1} = 1时,可以完美拟合,J(θ1)=0J({\theta_1}) = 0

再回到原问题,分别调整参数θ0\bf {\theta_0}θ1\bf {\theta_1},计算代价函数值。代价函数图如下。

image-20220826154926850

使用等高线图来表示。

image-20220826155133857

等高线表示:同一等高线上的点对应的代价值相等,中心点意味着代价值最小。

例如右边图像,画出的三点代价值相等。

可以将等高线图理解为三维图像在二维的投影。

梯度下降

梯度下降是一个用来求函数最小值的算法。

使用梯度下降算法来求出代价函数J(θ0,θ1)J({\theta_0}, {\theta_1})的最小值。

其思想是:开始时,随机选择一个参数的组合(θ0,θ1,....θn)({\theta_0},{\theta_1},....{\theta_n}),计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合,持续下去直到找到一个局部最小值(local minimum),因为并没有尝试完所有的参数组合,所以无法确定得到的局部最小值就是全局最小值(global minimum)。选择不同的初始参数组合,可能会得到不同的局部最小值。

image-20220828101743457

如上图,想象站在山上的这一点,在梯度下降算法中,要做的就是环顾四周,并决定向哪个方向下山,以及下山的每一步要迈多大的步子。如上图所示,每一个叉号或虚线点,都代表迈了一步。

每迈一步,都重复上述的步骤,从这个新的点,环顾四周,决定从哪个方向下山,然后迈一步,依次类推,直到接近局部最低点的位置。

批量梯度下降算法的公式为:

repeatuntilconvergence(收敛){θj:=θjαθjJ(θ0,θ1)(forj=0andj=1)}repeat\quad until\quad convergence(收敛) \{ \\ {\theta_j} := {\theta_j} - {\alpha}{\frac{\partial}{\partial{\theta_j}}}J(\theta_0, \theta_1) \quad\quad (for \quad j = 0\quad and\quad j = 1) \\ \}

其中符号:=为赋值操作,将等式右边的值赋值给等式左边。

α\alpha是学习率(learning rate),决定了沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。即控制了以多大的幅度更新参数。

在批量梯度下降中,每一次都同时让所有参数减去 学习率乘以代价函数的导数。

即所有参数要同时更新(Simultaneous update)。

正确的同步更新参数步骤是:

  • temp0:=θ0αθ0J(θ0,θ1)temp0:={\theta_0} - {\alpha}{\frac{\partial}{\partial{\theta_0}}}J(\theta_0, \theta_1)
  • temp1:=θ1αθ1J(θ0,θ1)temp1:={\theta_1} - {\alpha}{\frac{\partial}{\partial{\theta_1}}}J(\theta_0, \theta_1)
  • θ0:=temp0\theta_0:=temp0
  • θ1:=temp1\theta_1:=temp1

梯度下降的直观理解

梯度下降公式为:

θj:=θjαθjJ(θ0,θ1){\theta_j} := {\theta_j} - {\alpha}{\frac{\partial} {\partial {\theta_j} } }J(\theta_0, \theta_1)

为了简化,可以只讨论一个参数的情况,J(θ1)J(\theta_1)

image-20220828110657554

取点A的切线,该条切线的斜率就是J(θ1)J(\theta_1)的导数在点A处的值。该切线有一个正斜率,即点A处的导数为正。

那么使用梯度下降算法的更新规则。

可知ddθ1J(θ1)\frac{d}{d \theta_1}J(\theta_1)为正,那么根据公式:

θj:=θjαθjJ(θ0,θ1){\theta_j} := {\theta_j} - {\alpha}{\frac{\partial} {\partial{\theta_j} } }J(\theta_0, \theta_1)

θ1\theta_1会减去一个大于0的数,即根据梯度下降算法,要找到局部最小值,会从A点向x轴负方向移动。这与上图符合。

相应的,如果还按照上图,A点在最小值的左边,那么导数为负,θ1\theta_1会减去一个小于零的数,相当于向x轴正方向移动,同样符合寻找最小值的要求。

下面来看看如果学习率α\alpha太小或太大会出现什么情况:

如果α\alpha太小了,那么在寻找局部最小值时,会下降的非常缓慢,可能需要很多步才能到达最低点。

如果α\alpha太大了,那么很可能会越过最低点,甚至无法收敛。

image-20220828111740149

如上图,此时走到A点,如果α\alpha太大,根据梯度下降公式,下一次走的步子可能会非常大,走到C点,越过了最低点,并且接下来会一直在最低点左右振荡,无法收敛。

θ1\theta_1到达局部最低点时,此时导数为0,根据梯度下降公式,不再更新。因此,当已经处于局部最低点时,梯度下降法不会再改变参数的值。

来看一个例子,下图是代价函数J(θ1)J(\theta_1)

image-20220828112311870

从最高点开始下降,因为该点比较陡,因此导数会很大,那么根据梯度下降公式,从这一点到图中绿点的下降幅度会比较大。

在这个绿点时,导数没有在最高点那么大,因此继续下降时,下降的幅度会小一点,到达红色点。

在红色点时,导数更小,因此移动的幅度会更小。

依次类推,随着梯度下降法的运行,移动的幅度会自动变得越来越小,直到收敛到局部最小值。

总结一下,在梯度下降法中,当越接近局部最小值时,梯度下降法会自动地采取更小的幅度。因此在使用梯度下降过程中,没有必要再去额外减小α\alpha值来调整移动幅度。


梯度下降算法不仅适用于线性回归中,也可最小化其他算法中的代价函数。

梯度下降的线性回归

将梯度下降算法和代价函数结合,并将应用到具体的拟合直线的线性回归算法中。

梯度下降算法:

repeatuntilconvergence(收敛){θj:=θjαθjJ(θ0,θ1)(forj=0andj=1)}repeat \quad until\quad convergence(收敛) \{ \\ {\theta_j} := {\theta_j} - {\alpha} {\frac{\partial} {\partial {\theta_j} } }J(\theta_0, \theta_1) \quad\quad (for \quad j = 0\quad and\quad j = 1) \\ \}

线性回归公式:

hθ(x)=θ0+θ1xJ(θ)=12mi=1m(hθ(xi)yi)2h_\theta(x) = \theta_0 + \theta_1x \\ J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^i) - y^i)^2

对于之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数。

根据上述公式,可以将hθ(x)=θ0+θ1xh_\theta(x) = \theta_0 + \theta_1x代入到代价函数中。

J(θ)=12mi=1m(θ0+θ1xiyi)2J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(\theta_0 + \theta_1x^i - y^i)^2

算出代价函数的导数为:

j=0:θ0J(θ0,θ1)=ddθ0(12mi=1m(θ0+θ1xiyi)2)=ddθ0(12mi=1m((θ0+θ1xi)22(θ0+θ1xi)yi+(yi)2))=1mi=1m(θ0+θ1xiyi)=1mi=1m(hθ(xi)yi)\begin{aligned} j=0: \frac{\partial}{\partial \theta_0}J(\theta_0, \theta_1) = & \frac{d}{d \theta_0}(\frac{1}{2m}\sum_{i=1}^{m}(\theta_0 + \theta_1x^i - y^i)^2) \\ = & \frac{d}{d \theta_0}(\frac{1}{2m}\sum_{i=1}^{m}((\theta_0+\theta_1x^i)^2 - 2(\theta_0 + \theta_1x^i)y^i + (y^i)^2)) \\ = & \frac{1}{m}\sum_{i=1}^m(\theta_0 + \theta_1x^i - y^i) \\ = & \frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i) \end{aligned}

j=1:θ1J(θ0,θ1)=ddθ1(12mi=1m(θ0+θ1xiyi)2)=ddθ1(12mi=1m((θ0+θ1xi)22(θ0+θ1xi)yi+(yi)2))=1mi=1m(θ1xi+θ0yi)xi=1mi=1m(hθ(xi)yi)xi\begin{aligned} j=1: \frac{\partial}{\partial \theta_1}J(\theta_0, \theta_1) = & \frac{d}{d \theta_1}(\frac{1}{2m}\sum_{i=1}^{m}(\theta_0 + \theta_1x^i - y^i)^2) \\ = & \frac{d}{d \theta_1}(\frac{1}{2m}\sum_{i=1}^{m}((\theta_0+\theta_1x^i)^2 - 2(\theta_0 + \theta_1x^i)y^i + (y^i)^2)) \\ = & \frac{1}{m}\sum_{i=1}^m(\theta_1x^i + \theta_0 - y^i)x^i \\ = & \frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i)x^i \end{aligned}

则梯度下降算法可以写成:

Repeat{θ0:=θ0α1mi=1m(hθ(xi)yi)θ1:=θ1α1mi=1m(hθ(xi)yi)xi}Repeat\quad \{ \\ \theta_0:= \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i) \\ \theta_1:= \theta_1 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i)x^i \\ \}

注意:参数需要同时更新。


在上述讲解学习率α\alpha时,图中具有多个局部最低点,因此使用梯度下降得到的局部最小值并不一定是全局最小值。

但是在线性回归问题中,代价函数总是一个弓形函数。

image-20220828121718705

术语叫做:凸函数(convex function)。

凸函数没有局部最优,只有一个全局最优值


这里使用的梯度下降算法称为批量梯度下降。这里的"批量"指的是在梯度下降的每一步中,都用到了所有的数据样本。

在计算微分求导项时,进行求和运算,因此在每一步的梯度下降中,都需要计算,这个微分求导项对所有训练样本求和。因此批量梯度下降说明需要考虑所有训练样本。

也有其他类型的梯度下降法,不是批量型的,不考虑所有的训练样本,而是每次只关注训练数据集的一个子集。

线性代数

  • 一个四行两列的矩阵,它的维数(dimension)是:4×2
  • 向量是特殊的矩阵,只有一列,是一个n×1的矩阵。例如一个有四行的向量,它是一个四维向量。

多变量线性回归

以上述预测房屋价格为例子,但是输入特征变为四个,数据如下

房屋面积卧室数量楼层房子年龄价格
21045145460
14163240232
15343230315
8522136178

一些表示:

  • n:表示特征数量
  • x(i)x^{(i)}:表示第i个训练样本的输入特征值,例如x(2)=[1416,3,2,40]Tx^{(2)} = [1416, 3, 2, 40]^T
  • xj(i)x^{(i)}_j:表示第i个训练样本的第j个特征值,例如x3(2)=2x^{(2)}_3 = 2

之前假设函数为:

hθ(x)=θ0+θ1xh_{\theta}(x) = {\theta}_0 + {\theta_1}x

多变量线性回归中,假设函数有四个输入变量,就不能表示成上述式子了。应该为:

hθ(x)=θ0+θ1x1+θ2x2+θ3x3+θ4x4h_{\theta}(x) = {\theta}_0 + {\theta_1}x_1 + {\theta_2}x_2+{\theta_3}x_3+{\theta_4}x_4

为了表示方便,设x0=1x_0 = 1,那么上式写为:

hθ(x)=θ0x0+θ1x1+θ2x2+θ3x3+θ4x4h_{\theta}(x) = {\theta}_0x_0 + {\theta_1}x_1 + {\theta_2}x_2+{\theta_3}x_3+{\theta_4}x_4

相当于定义了一个额外的特征变量x0x_0,值为1。

那么输入是一个n+1维的向量:

x=[x0x1x2xn]x = \begin{bmatrix} x_0 \\ x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}

同时将所有参数看成一个n+1维向量。

θ=[θ0θ1θ2θn]\theta = \begin{bmatrix} {\theta}_0 \\ {\theta}_1 \\ {\theta}_2 \\ \vdots \\ {\theta}_n \end{bmatrix}

那么假设函数可写为:

hθ(x)=θTxh_{\theta}(x) = {\theta}^Tx

即 向量θ\thetaxx的内积。

代价函数可写为:

J(θ)=12mi=1m(hθ(x(i))y(i))2J({\theta}) = \frac{1} {2m} \sum_{i=1}^{m} ( h_{\theta}(x^{ (i) }) - y^{ (i) } )^2

其中θ\theta是一个向量。

那么梯度下降公式为:

repeat{θj:=θjαθjJ(θ)(foreveryj=0,...,n)}repeat\quad \{ \\ {\theta_j} := {\theta_j} - {\alpha} {\frac{\partial} {\partial{\theta_j} } }J(\theta) \quad\quad (for\quad every j = 0, ...,n) \\ \}

在单变量线性回归中,参数θ\theta的变化公式为:

n = 1

Repeat{θ0:=θ0α1mi=1m(hθ(xi)yi)θ1:=θ1α1mi=1m(hθ(xi)yi)xi}Repeat\quad \{ \\ \theta_0:= \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i) \\ \theta_1:= \theta_1 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^i) - y^i)x^i \\ \}

n > 1时,

新的公式为:

θj:=θjα1mi=1m(hθ(x(i))y(i))xj(i)(simultaneouslyupdateθjforj=0,...,n)\theta_j:= \theta_j - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x^{(i)}_j \\ (simultaneously\quad update\quad \theta_j\quad for\quad j = 0,...,n)

例如有两个输入变量的情况,有θ0,θ1,θ2\theta_0,\theta_1,\theta_2三个参数,那么参数θ\theta的变化公式为:

θ0:=θ0α1mi=1m(hθ(x(i))y(i))x0(i)θ1:=θ1α1mi=1m(hθ(x(i))y(i))x1(i)θ2:=θ2α1mi=1m(hθ(x(i))y(i))x2(i)\theta_0:= \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x^{(i)}_0 \\ \theta_1:= \theta_1 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x^{(i)}_1 \\ \theta_2:= \theta_2 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x^{(i)}_2

其中x0(i)=1x^{(i)}_0 = 1

特征缩放

在面对多维特征问题时,需要保证这些特征都具有相似的尺度,即这些特征的取值范围都大致相同,这会帮助梯度下降算法更快地收敛。

例如以房价预测为例,使用两个特征,房屋大小和房间数量。

房屋大小的取值范围为:0~2000平方英尺

房间数量取值为:0~5

那么以这两个参数为横纵坐标,绘制代价函数的等高线图。

image-20220906101702445

可以看出图像很扁,梯度下降算法需要经过很多次的迭代才能收敛。

因此如果x1=房屋大小2000,x2=房屋数量5x_1 = \frac{房屋大小}{2000}, x_2 = \frac{房屋数量}{5},进行特征缩放。那么x1x2x_1,x_2的取值范围都是[0, 1]

此时代价函数的等高线图就会更圆,也会更快地收敛。

一般来说,进行特征缩放时,会把特征的取值范围约束到[-1, 1]这个范围之间。

当然[-1, 1]这范围并不是绝对的,只要将特征缩放到相似的范围就可以。

特征缩放有四种几种方式。

均值归一化(Mean normalization)

公式为:

x=xmean(x)max(x)min(x)x^* = \frac{x - mean(x)}{max(x) - min(x)}

其中mean(x)mean(x)代表x的平均值。

例如上述例子,x1x_1的范围为[0, 2000],假设平均值为1000, 而x2x_2的范围为[0, 5],假设平均值为2。

那么使用均值归一化方式来进行特征缩放。

x1=size100020000.5x10.5x2=bedrooms250.5x20.5x1 = \frac{size - 1000}{2000}\quad -0.5\le x1 \le 0.5 \\ \\ x2 = \frac{bedrooms - 2}{5}\quad -0.5\le x2 \le 0.5

这里除以5其实并不准确,因为max-min的值应为4,但是特征缩放并不需要太精确,只是为了能让梯度下降更快收敛。

min-max标准化

公式为:

x=xmin(x)max(x)min(x)x^* = \frac{x - min(x)}{max(x) - min(x)}

学习率

梯度下降算法收敛所需要的迭代次数会根据模型的不同而不同,无法提前预知。可以通过绘制迭代次数和代价函数的图表来观察算法在何时收敛。
image-20220906110122700

如上图,横坐标(No.of iterarions)为迭代次数,竖坐标为代价函数的值。每一次迭代都会产生一组参数θ\theta值,对应一个代价函数值。

也有一些自动测试是否收敛的方法,例如判断两次迭代代价函数的变化值是否小于某个阈值(例如0.0001),但是阈值很难选择,通常还是看上面这样的图表更好。

有时候,图表可能会出现这种情况:

image-20220906110452685

或者image-20220906110521599

也就是说,代价函数的值并没有随着迭代次数的增加而减小。

通常来说,这两种情况都是由于学习率α\alpha太小

对于足够小的学习率α\alpha,能够确定,每次迭代以后,代价函数的值都会更小。

但是如果学习率太小的话,收敛会非常慢。

总结一下。

  • 如果学习率α\alpha太小,收敛会非常慢。
  • 如果学习率太大,那么代价函数并不会随着每次迭代而减小,甚至不会收敛。

通常可以考虑尝试以下学习率:

α=0.01,0.03,0.1,0.3,1,3,10\alpha = 0.01,0.03, 0.1, 0.3, 1, 3,10


2-线性回归
https://zhaoquaner.github.io/2022/09/09/MachineLearning/CourseNote/2-线性回归/
更新于
2022年9月12日
许可协议