普通最小二乘法

批量梯度下降 中讨论了,如何利用梯度下降的方式,如何一步一步寻找到损失函数的最小值,得到最佳拟合的 \(\theta\),这里我们继续讨论线性拟合问题,这次尝试用 最小二乘法 直接求解 \(\theta\),就是说我们不用从山顶寻找梯度一步一步的往最低点走,某种情况下可以直接计算出 \(\theta\)

普通最小二乘法 (Ordinary least squares)

最小二乘法 (又称 最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配,利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小,下面一步一步推导。

Step 1 . 最初我们是有一组训练数据 \(D = {(x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)})...(x^{(N)},y^{(N)})}\) ,其中 \(x^{(i)}\in R^n\) 我们想要拟合的曲线为 \(H(\theta) = \theta^TX = \theta_0X_0 + \theta_1X_1 + \cdots +\theta_nX_n\) ,这里 \(X_0 = 1\)

Step 2 . 现在我们用矩阵的形式来表示 \(H(\theta)\) ,我们有 \(N\) 个样本数据,每个数据维度是 \(n\)

$$ \left[ \begin{array}{c} \theta_0X_0^{(1)} + \theta_1X_1^{(1)} + \cdots + \theta_nX_n^{(1)} = y^{(1)}\\ \theta_0X_0^{(2)} + \theta_1X_1^{(2)} + \cdots + \theta_nX_n^{(2)} = y^{(2)}\\ \vdots \\ \theta_0X_0^{(N)} + \theta_1X_1^{(N)}+ \cdots + \theta_nX_n^{(N)} = y^{(N)} \end{array} \right]\\ $$

Step 3 . 这里把上面的公式组合拆分成3部分 \(X\) 数据集, \(\theta\) 参数, \(Y\) 目标值

$$ X = \left[ \begin{array}{ccc} 1 & x_1^{(1)} & \cdots & x_n^{(1)}\\ 1 & x_1^{(2)} & \cdots & x_n^{(2)}\\ \vdots & \vdots & \vdots & \vdots\\ 1 & x_1^{(N)} & \cdots & x_n^{(N)} \end{array} \right]\\ $$
$$ \theta = \left[ \begin{array}{c} \theta_1\\ \theta_2\\ \vdots\\ \theta_n \end{array} \right]\\ $$
$$ Y = \left[ \begin{array}{c} y_1\\ y_2\\ \vdots\\ y_n \end{array} \right]\\ $$

这时等式就可以写成 \(X\theta = Y\)

Step 4 . 我们想要通过这N个等式来求解 \(\theta\) ,当然这里不一定会有 \(\theta\) 会使所有等式都成立,这时候就还是需要一个损失函数来判断取 \(\theta\) 的时候,误差是否为最小,这里就和梯度下降是一个思路,用误差平方和来代表损失,但是这里是用矩阵的形式来表示,矩阵的 L-2 范数即表示误差平方和

$$ CostFunction = J(\theta) = ||X\theta - Y||_2^2\\ $$

Step 5 . 这时候就不需要用梯度下降的方法去一步一步计算,还是可以根据人物下山的例子想象一下,梯度下降是人物以 \(\alpha\) 为步长,走一步计算一下梯度再走下一步,而这里我们更像是人物开了天眼,一次性从所有的数据中找到最优解 \(\theta\)

Step 6 . 首先来展开 \(J(\theta)\)

$$ \begin{equation} \begin{aligned} J(\theta) = ||X\theta - Y||_2^2 &= (X\theta - Y)^T(X\theta - Y)\\ & = (\theta^TX^T - Y^T)(X\theta -Y)\\ &=\theta^TX^TX\theta - \theta^TX^TY - Y^TX\theta + Y^TY\\ &=\theta^TX^TX\theta - 2\theta^TX^TY + Y^TY \end{aligned} \end{equation} $$

上式 \(\theta^TX^TY\) 是一个标量,因为 \(\theta^T \in 1\times (n+1)\) , \(X^T \in (n+1)\times N\) , \(Y \in N\times1\),所以根据矩阵乘法的特点,这里乘出来之后会是1个标量,\(Y^TX\theta\) 同理,所以二者可以合并成 \(2\theta^TX^TY\)

Step 7 . 在梯度下降中,我们一步一步的计算梯度,一直走到最低点也就是导数为0的点,这里可以直接对损失函数求导,令导数=0即可

$$ \begin{equation} \begin{aligned} \frac{\partial J(\theta)}{\partial \theta} &= \frac {\partial (\theta^TX^TX\theta - 2\theta^TX^TY + Y^TY)}{\partial \theta}\\ &=\frac{\partial(\theta^TX^TX\theta)}{\partial \theta} - 2X^TY + 0 \end{aligned} \end{equation}\\ $$

此时注意到 \(X^TX\) 是一个 \((n+1)\) 维的方阵,这时候根据公式

$$ \frac{\partial (X^TBX)}{\partial X} = (B + B^T) X\\ $$

如上矩阵相关的公式,都可以在这个 The Matrix Cookbook 中查找到,所以可以推导出 \(\theta\)\(X\) 数据集和 \(Y\) 目标集来表示

$$ \begin{aligned} \frac{\partial(\theta^TX^TX\theta)}{\partial \theta} &= (X^TX +X^TX) \theta = 2X^TX\theta\\ \frac{\partial J(\theta)}{\partial \theta} &= 2X^TX\theta - 2X^TY = 0\\ \theta &= (X^TX)^{-1}X^TY \end{aligned}\\ $$

总结

至此已经计算出线性回归中 \(\theta\) 的值,也就是说,我们不必要用梯度下降的方式去迭代收敛到最小值,可以直接根据公式得到 \(\theta\) 清晰的解析解,但是最小二乘法并不能解决所有情况,有以下几点:

  • 通过公式 \(\theta = (X^TX)^{-1}X^TY\) 发现对在数据集基础上做 逆运算,计算矩阵的逆需要大量的计算,虽然现在计算机能力都很强,但是那也架不住,动辄上百万的数据量和上万的维度,所以首先 数据量过大不适合用最小二乘法,反观梯度下降就没有这个问题( 一步一步迭代嘛 )

  • 还是逆运算,并不是所有的矩阵都是可逆的,如果数据集中有 多重共线性 的问题( 矩阵行列式=0 ),这里求逆就行不通了,即便是可逆,多重共线性也会让结果很不准确,但是梯度下降还是可以一步一步收敛。当然了也可以通过比如降维,求伪逆,损失函数加上个惩罚项( 后面会讨论LASSORidge )等办法对数据集进行处理,转化成可逆矩阵。


😛

about me