sklearn是如何求解线性回归问题的?
有没有脱口而出梯度下降,起码我自己下意识的认为是使用梯度下降,直到有一次无意中看到sklearn的用户指导手册,1.1.1.2 一行小小的备注:
The least squares solution is computed using the singular value decomposition of X.
哦?原来sklearn是用SVD求解线性回归啊~
线性回归的loss function就是在求解最小二乘(least squares)嘛,那么来简单聊一下为什么SVD可以用来求解最小二乘问题。
最小二乘问题,就是给定一组线性方程组 A x = b Ax = b Ax=b,求 x x x是什么,这个方程组一般来说是 超定方程(overdetermined),也就是说方程的个数大于未知数的数量, 最典型的就是线性回归问题。
最小二乘问题是通过最小化 ∥ b − A x ∥ 2 \left \| b - Ax \right \|_{2} ∥b−Ax∥2得到的 x x x作为解,这里的 x x x是未知数, A A A自变量, b b b因变量。机器学习里面通常用 x x x标记自变量 y y y标记因变量,系数用 w w w标记。
写成element-wise:
min ∑ i = 1 m [ b i − ( A x ) i ] 2 \min \sum_{i =1}^{m}[b_i - (Ax)_i] ^ 2 mini=1∑m[bi−(Ax)i]2
其中 A A A是一个 m × n m \times n m×n的矩阵,表示我们有 m m m个样本 n n n个未知数。
下面的讨论,我们都假设 A A A是满秩的:
任意矩阵都可以进行SVD分解,不要问为什么,就是这么牛x,如果对 A A A进行SVD分解可以得到三个矩阵:
A = U Σ V T A = U \Sigma V^{T}