线性回归是一种十分基础的机器学习算法。但是基础并不意味着不重要,相反,基础往往才是最重要的。很多人入门机器学习,第一个学习的就是线性回归。例如,吴恩达的机器学习课程中,也是以线性回归开始。
对于一个线性回归问题,一般来讲有 2 种解决方法,分别是:最小二乘法和梯度下降法。其中最小二乘法又分为两种求解思路:代数求解和矩阵求解。
接下来,我将梳理线性回归问题的求解过程,以及使用 Python 进行编程实现的完整过程。

最小二乘法代数求解推导

最小二乘法是线性回归问题最常用的解决方法。我们这里使用到的是普通最小二乘法,英文为:Ordinary Least Squares,简称 OLS。最小二乘法中的「二乘」代表平方,最小二乘也就是最小平方。而这里的平方就是指代平方损失函数。首先,假设我们需要求解的是一元线性回归问题,及其对应的线性方程如下:
简单来讲,最小二乘法也就是求解平方损失函数最小值的方法。那么,到底该怎样求解呢?这就需要使用到高等数学中的知识。推导如下。
我们所知,平方损失函数的公式为:
由于最终的目标是求取平方损失函数 $min(f)$ 最小时对应的 $w$。所以,先求 $f$ 的一阶偏导数:
然后,我们令 $\frac{\partial f}{\partial w_{0}}=0$ 以及 $\frac{\partial f}{\partial w_{1}}=0$,解得:
至此,我们就用代数的方式求解出线性方程的参数了。其中,$w_0$ 经常习惯称之为截距项。

最小二乘法代数求解实现

接下来,我们依据上面的推导过程,使用 Python 进行实现。这里,假设进行线性拟合的数据如下:
x=[55,71,68,87,101,87,75,78,93,73]y=[91,101,87,109,129,98,95,101,104,93]
然后,根据公式实现参数计算函数ols_algebra(x, y):
defols_algebra(x,y):n=len(x)w1=(n*sum(x*y)-sum(x)*sum(y))/(n*sum(x*x)-sum(x)*sum(x))w0=(sum(x*x)*sum(y)-sum(x)*sum(x*y))/(n*sum(x*x)-sum(x)*sum(x))returnw0,w1
最后,就可以得到拟合后的参数值。
importnumpyasnpols_algebra(np.array(x),np.array(y))>>>(44.25604341391219,0.7175629008386778)
那么,所对应的线性方程为:$y = 0.718 * x + 44.256$。

最小二乘法矩阵求解推导

除了上面的代数推导过程。通常在实际情况中,更多会使用矩阵的方式来求线性拟合参数。因为在大规模运算中,矩阵的计算效率更高。
矩阵的推导会稍微复杂一些。同样,根据一元线性函数的表达式 $ y(x, w) = w_0 + w_1x$。那么,转换成矩阵形式为:
即:
然后,平方损失函数转换为矩阵形式:
此时,对矩阵求偏导数得到:
当矩阵 $X^TX$ 满秩(不满秩无法通过 OLS 方法求解)时,$(X^TX)^{-1}X^TX=E$,且$EW=W$。所以,$(X^TX)^{-1}X^TXW=(X^TX)^{-1}X^Ty$。最终得到:
以上,我们完成了线性回归矩阵求解推导。

最小二乘法矩阵求解实现

使用矩阵方法求解时的代码实现过程会更加简单,因为最终参数的求解就只有一个公式。