周志华西瓜书二线性回归

在介绍线性回归模型前,先统一一些等式的表达式。

x_{j}^{(i)} = 第 i 个训练样本中的第 j 个属性值
x^{(i)} = 第 i 个训练样本所有属性组成的向量
m = 样本数
n = 属性数

给定数据集 D = {(x^{(1)},y_1), (x^{(2)},y_2), ... , (x^{(m)},y_m)},「线性回归 」试图学得一个通过属性的线性组合来进行预测的函数,即「假设函数」为

h_\theta(x) = \theta _{0} + \theta _{1}x_1 + \theta _{2}x_2 +...+ \theta _{n}x_n

一元线性回归

假设函数

首先,介绍最简单的一种情况:只有一个输入变量,即只有一个属性。那么上面的假设函数(预测函数)将简化为:

h_\Theta(x) = \Theta _{0} + \Theta _{1}x_1

这称为「一元线性回归」。假设有如下的训练集

输入 x 输出 y
0 4
1 7
2 7
3 8

现在,我们假设 \Theta _{0}=2, \Theta _{1} = 2,即假设函数为h_\Theta(x) = 2 + 2x_1。但是如何衡量这个假设函数的精确程度,即预测值h_\Theta(x)与真实值 y 之间的差别呢。这就涉及到了「代价函数」。

代价函数

通过代价函数来衡量我们的假设函数的准确性。这里,代价函数用的是「均方误差」,即

J(\Theta ) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\Theta }(x^i) - y_i)^{2}

公式理解:均方误差有非常好的几何意义,(h_{\Theta }(x^i) - y_i)代表预测点与真实点之间的欧氏距离。所有点距离平方之和除以样本数 m 就是均方误差。而再除以 2 是为了方便计算。代价函数值越小越好。

此时,我们能够具体计算出假设函数的精确度,下面的问题就是「如何提高假设函数的精确度」,即「寻找\Theta _{0},\Theta _{1}令代价函数取最小值」,而这种基于均方误差最小化来进行模型求解的方法称为「最小二乘法」。

梯度下降算法

梯度下降算法就是最常用的求代价函数最小值的算法。该算法的思想是通过一步步迭代找到代价函数的最小值。

想象着,\Theta_0 为 x 轴,\Theta_1 为 y 轴。代价函数J(\Theta) 为 z 轴。图上的点将是代价函数的结果,使用我们的假设和那些特定的θ参数。如下图所示。

梯度下降算法过程示意图

算法过程:假设初始参数产生的代价值为图中右边红圈的点,通过梯度下降算法,修改参数的值让代价函数取值就会一步一步下降,比如沿着图中黑线下降。当将最低点(如箭头指示的点)时,算法将不会再改变参数的值(即算法收敛),此时得到的参数让代价函数取值最小。

需要注意的是, 起始点的位置略有不同,你会得到一个不同的局部最优解,这就是梯度下降算法的一个特点。同时,只有代价函数为凸函数时,代价函数定能取全局最小值。

在只有两个参数下,算法公式如下:

两个参数下的梯度下降算法

公式的理解:对代价函数求偏导数,就是求出该点的切线的斜率,它将为我们提供一个朝向的方向。我们在最陡下降的方向上降低代价函数。每个步骤的大小由参数 α 确定,该参数称为学习率。当梯度下降算法到达最小点(不管是局部还是全局)时,算法再也无法改变参数(因为导数为 0),此时即收敛。

计算过程需要注意同步更新,具体如下图:

梯度下降算法计算过程

多元线性回归

理解了单元线性回归,我们来讲更一般情况下的线性回归,即多个属性的线性回归,称为「多元线性回归」。

假设函数

当输入值有多个(即x=(x_1,x_2,...,x_n))时,线性回归的假设函数将变成
h_\theta(X) = X\theta = \begin{bmatrix} x_{0}^{(1)} & x_{1}^{(1)} & ... & x_{n}^{(1)}\\ x_{0}^{(2)} & x_{1}^{(2)} & ... & x_{n}^{(2)}\\ ... & ... & ... & ...\\ x_{0}^{(m)} & x_{1}^{(m)} & & x_{n}^{(m)} \end{bmatrix}*\begin{bmatrix} \theta_0\\ \theta_1\\ ...\\ \theta_n \end{bmatrix}, x_0=1
这里,将公式转换成向量描述,有利于编程实现。在很多编程语言中,内部集成了线性代数的计算并运算速度很快。

代价函数

多元线性回归的代价函数还有一样。

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

矢量化表示:
J(\theta ) = \frac{1}{2m} (X \theta - y)^T (X\theta - y), y = \begin{bmatrix} y_1\\ y_2\\ ...\\ y_m \end{bmatrix}

梯度下降算法

相比于单元线性回归,需要计算的 \theta,从 \theta_0,\theta_1 变成 \theta_0,\theta_1, ..., \theta_n

多元线性回归梯度下降算法

同样,可以使用向量表示。
\theta = \theta - \frac{\alpha}{m}\begin{bmatrix} \sum_{i=1}^{m}(h_{\theta }(x^i) - y^i) x_{0}^{i} \\ \sum_{i=1}^{m}(h_{\theta }(x^i) - y^i) x_{1}^{i}\\ ...\\ \sum_{i=1}^{m}(h_{\theta }(x^i) - y^i) x_{m}^{i} \end{bmatrix} = \theta - \frac{\alpha}{m} X^T (X \theta - \overrightarrow{y})

这里,说一下梯度下降算法几个建议

  1. 调试梯度下降,以迭代次数为 x 轴,以代价函数值 J(\theta) 为 y 值,绘制图表。如果 J(\theta) 增加,则需要降低 \alpha 值;
  2. 如果 J(\theta) 在一次迭代中减少小于一个很小的值(比如10^{-3})时,可以视为收敛,停止迭代。然而,事实证明这个很小的值很难选择;
  3. \alpha 足够小并且每次迭代都在下降时,建议将 \alpha 减少3的倍数。如 0.3 变为 0.1。

属性正规化

由于 θ 将在较小取值范围内下降较快而再较大取值范围内下降较慢,我们可以通过将每个输入值 x 放在较小的取值范围内进而减少迭代次数、加速梯度下降。由经验,将 x 的取值范围在 [-1, 1] 或者 [-1/3, 1/3]较好。(如某属性取值范围 [10,100] 过大需要正规化;某属性取值范围 [-0.001,0.01] 过小也需要正规化)

有 2 种实现方法:

  1. 特征缩放(feature scaling):输入值 / 输入值的极差;

  2. 均值归一化(mean normalization):(输入值 - 输入值的均值) / 输入值的标准差。

原始属性值 x_i 使用特征缩放 使用均值归一化
5 \frac{5}{8 - 4} = 1.25 \frac{5-6}{1.8257} = -0.55
4 1 -1.10
7 7/4 0.55
8 2 1.10

正规方程

求代价函数最小值还有一种方法「正规方程」。与梯度下降算法最大的区别在于正规方程不需要通过迭代,一步即可求得最小值。同时,正规方程得到了充分的数学证明.。补充一句,正规方程不需要属性正规化处理。

正规方程公式 :

\theta = (X^T * X)^{-1} * X^T * y, X \epsilon \mathbb{R}^{m*(n+1)}
其中,\theta, x, y 均为向量。需要注意的是,(x^T * x) 可能出现不可逆的情况,具体参考线性代数。这里提及常见的两种不可逆的情况:

常见的不可逆的情况

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

梯度下降算法 正规方程
需要选择 \alpha 不需要选择 \alpha
需要迭代 不需要迭代
时间复杂度O(kn^2) 时间复杂度O(n^3),因为需要计算(x^T * x)^{-1}
当 n 较大时,效果很好 当 n 较大时,运行慢

根据经验,两种算法适用范围

  1. 当 n 大的时候(大概量级超过10^4),使用梯度下降算法,因为正规方程需要计算 n*n 逆矩阵耗时巨大;
  2. 当 n 小的时候(大概量级不超过10^4),使用正规方程。

最后

一图总结线性回归模型的内容

线性回归模型

参考文献

  1. Coursesa 机器学习
      </div>

猜你喜欢

转载自blog.csdn.net/leichangqing/article/details/89080487
今日推荐