在之前的文章当中,我们介绍过了简单的朴素贝叶斯分类模型,介绍过最小二乘法,所以这期文章我们顺水推舟,来讲讲线性回归[1]模型。
线性回归的本质其实是一种统计学当中的回归分析方法,考察的是自变量和因变量之间的线性关联。后来也许是建模的过程和模型训练的方式和机器学习的理念比较接近,所以近年来,这个模型被归入到了机器学习的领域当中。然而,不管它属于哪个领域,整个模型的思想并没有发生变化。我们只要有所了解即可。
模型概念
线性回归的定义非常简单,它最简单的形式其实就是一元一次方程组。比如,我们有如下式子:
我们知道若*x和y,要求w和b。解的方法很简单,我们通过消元法,就可以很容易求出来w和b。
我们针对以上的式子做两个变形,第一个变形是我们的自变量x不再是一个单值,而是一个m * n的矩阵。m表示样本数,n表示特征数,我们写成X。X矩阵的每一行是一个n维的行向量,它代表一个样本。它的系数W也不再是一个值,而是一个n * 1的列向量,它的每一维代表一个样本当中这一维的权重。我们把上面的公式写成矩阵相乘的形式:
式子里的Y、X和W分别是m * 1, m * n和n * 1的矩阵。
这里有两点要注意,第一点是这里的b我们可以当做是一个浮点数的参数,但是实际上它也是一个m * 1的矩阵(列向量)。但即使我们用的是浮点数也没关系,因为在我们实现模型的时候,numpy或者TensorFlow或者是其他的框架会自动地使用广播将它转化成向量来做加法。
第二点是这里的X写在了W的前面,这也是为了矩阵乘法计算方便。当然我们也可以将X和W都转置,写成WX,但这样得到的结果是一个1 * m的行向量,如果要和Y进行比较,那么还需要再进行一次转置。所以为了简便,我们对调了X和W的顺序。所以大家不要觉得疑惑,明明是WX b怎么写出来就成了XW b了。
我们把式子列出来之后,目标就很明确了,就是要通过计算求到一个W和b使得式子成立。但是在此之前,我们需要先明确一点:在实际的工程应用场景当中,是不可能找到W和b使得XW b恰好和Y完全相等的。因为真实的场景当中数据都存在误差,所以精确的解是不存在的,我们只能退而求其次,追求尽可能精确的解。
最小二乘法与均方差
在之前的文章当中我们介绍过最小二乘法[2],遗忘的同学可以点击下方链接回顾一下。
在机器学习的过程当中,模型不是直接达到最佳的,而是通过一步一步的迭代,效果逐渐提高,最终收敛不再剧烈变化。我们明白了这个过程,就能理解,在学习的过程当中,我们需要一个量化的指标来衡量模型当前学习到的能力。就好像学生在上学的时候需要考试来测试学生的能力一样,我们也需要一个指标来测试模型的能力。
对于回归模型而言,预测的目标是一个具体的值。显然这个预测值和真实值越接近越好。我们假设预测值是y_,真实值是y,显然应该是 |y - y_| 越小越好。
但是绝对值的计算非常麻烦,也不方便求导,所以我们通常会将它平方,即:(y - y_)^2 最小。对于m个样本而言,我们希望它们的平方和尽量小。
这个式子和我们之前介绍的方差非常相似,只不过在方差当中减的是期望值,而在这里我们减的是真实值。所以这个平方差也有一个类似的名称,叫做均方差。
方差反应的是变量在期望值附近的震荡程度,同样的,均方差反应的是模型预测值距离真实值的震荡程度。
寻找最佳的参数来使得均方差尽量小,就是最小二乘法。
推导过程
到这里,我们已经搞清楚了模型的公式,也写出了优化的目标,已经非常接近了,只剩下最后一步,就是优化这个目标的方法。
如果我们观察一下均方差,我们把它写全:(Y - (XW b))^2 ,我们将W视作变量的话,这其实是一个广义的二次函数。二次函数怎么求最小值?当然是求导了。
在求导之前,我们先对均方差做一个简单的变形:我们想办法把b处理掉,让式子尽可能简洁。
首先,我们在X当中增加一列1,也就是将X变成m * (n 1)的矩阵,它的第一列是常数1,新的矩阵写成X_new
同样,我们在W中也增加一行,它的第一行写成b,我们将新的矩阵写成 θ,我们可以得到:
之后,我们对均方差进行变形: