机器学习 (machine learning)中最常见的任务之一是预测。给定一组输入特征,我们希望预测一个输出值。这其中最简单的形式是线性回归,我们尝试找出一条最能拟合数据的直线。初看之下,这可能像是统计学问题,但其公式表述和解法纯粹是线性代数。
从直线到方程组
直线方程为 y = m x + b y = mx + b y = m x + b 。其中:
y y y 是我们想预测的值 (因变量)。
x x x 是我们的输入特征 (自变量)。
m m m 是直线的斜率,决定其倾斜程度。
b b b 是 y 截距,即直线与垂直轴相交的点。
在机器学习 (machine learning)中,我们常用不同的记号。我们可以将方程写作 y = w 1 x 1 + w 0 y = w_1x_1 + w_0 y = w 1 x 1 + w 0 ,其中 w 1 w_1 w 1 是特征 x 1 x_1 x 1 的权重 (weight)(斜率),w 0 w_0 w 0 是偏置 (bias)项(截距)。我们的目的是找到权重 (w 1 w_1 w 1 和 w 0 w_0 w 0 ) 的合适值,使直线尽可能地拟合我们的数据。
设想一下,我们有一个小数据集,用于根据房屋面积(平方英尺)预测房价。
面积 (平方英尺)
价格 (千美元)
1500
300
2000
410
1200
270
1800
350
如果我们的直线要完美地经过每个点,我们就需要满足一个方程组:
300 = w 1 ( 1500 ) + w 0 300 = w_1(1500) + w_0 300 = w 1 ( 1500 ) + w 0
410 = w 1 ( 2000 ) + w 0 410 = w_1(2000) + w_0 410 = w 1 ( 2000 ) + w 0
270 = w 1 ( 1200 ) + w 0 270 = w_1(1200) + w_0 270 = w 1 ( 1200 ) + w 0
350 = w 1 ( 1800 ) + w 0 350 = w_1(1800) + w_0 350 = w 1 ( 1800 ) + w 0
这个难点显而易见。一条直线极不可能穿过所有这四个点。数据含有噪声。与其寻找一个完美解,我们寻找能使总误差最小的直线。
找出最能代表蓝色数据点所示关系的红线是线性回归的目的。
构建矩阵方程
这就是线性代数提供巧妙而有力地表示此情形的方法。正如我们在第四章所见,一个线性方程组可以写成矩阵形式 A x = b Ax = b A x = b 。我们来组合这些组成部分。
向量 (vector) b b b (在此情形中为 y y y )包含我们的目标值,即房价。
y = [ 300 410 270 350 ] y = \begin{bmatrix} 300 \\ 410 \\ 270 \\ 350 \end{bmatrix} y = 300 410 270 350
向量 x x x 包含我们正在寻找的未知参数 (parameter):截距 w 0 w_0 w 0 和斜率 w 1 w_1 w 1 。
x = [ w 0 w 1 ] x = \begin{bmatrix} w_0 \\ w_1 \end{bmatrix} x = [ w 0 w 1 ]
矩阵 A A A 是一个很有趣的部分。它常被称为“设计矩阵”。每一行对应一个数据点,每一列对应一个特征。我们的方程形式是 w 1 ⋅ ( 尺寸 ) + w 0 ⋅ 1 w_1 \cdot (\text{尺寸}) + w_0 \cdot 1 w 1 ⋅ ( 尺寸 ) + w 0 ⋅ 1 。因此,特征的第一列将是房屋尺寸,第二列将表示截距 w 0 w_0 w 0 的常数项。为使数学运算成立,我们将第二列填充为 1。
A = [ 1500 1 2000 1 1200 1 1800 1 ] A = \begin{bmatrix} 1500 & 1 \\ 2000 & 1 \\ 1200 & 1 \\ 1800 & 1 \end{bmatrix} A = 1500 2000 1200 1800 1 1 1 1
等等,我们为什么要添加一列 1 呢?我们来检查一下执行矩阵-向量乘法 A x Ax A x 时会发生什么:
A x = [ 1500 1 2000 1 1200 1 1800 1 ] [ w 1 w 0 ] = [ 1500 ⋅ w 1 + 1 ⋅ w 0 2000 ⋅ w 1 + 1 ⋅ w 0 1200 ⋅ w 1 + 1 ⋅ w 0 1800 ⋅ w 1 + 1 ⋅ w 0 ] Ax = \begin{bmatrix} 1500 & 1 \\ 2000 & 1 \\ 1200 & 1 \\ 1800 & 1 \end{bmatrix} \begin{bmatrix} w_1 \\ w_0 \end{bmatrix} = \begin{bmatrix} 1500 \cdot w_1 + 1 \cdot w_0 \\ 2000 \cdot w_1 + 1 \cdot w_0 \\ 1200 \cdot w_1 + 1 \cdot w_0 \\ 1800 \cdot w_1 + 1 \cdot w_0 \end{bmatrix} A x = 1500 2000 1200 1800 1 1 1 1 [ w 1 w 0 ] = 1500 ⋅ w 1 + 1 ⋅ w 0 2000 ⋅ w 1 + 1 ⋅ w 0 1200 ⋅ w 1 + 1 ⋅ w 0 1800 ⋅ w 1 + 1 ⋅ w 0
\text{请注意:我们在此重新排列了 A 和 x 中的列,以匹配 (尺寸) * w1 + 1 * w0 的形式,这是一种常见做法。}
这种乘法完美地重构了我们原始的方程组。我们整个情形现在可以表述为寻找使 A x Ax A x 尽可能接近 y y y 的向量 x x x 。
完整的情形表达为:
A x ≈ y Ax \approx y A x ≈ y
矩阵表述的优点
这种表示法不止是记号上的简便。它有几个明显的好处:
紧凑性: 我们用一个简洁的方程表示包含数千个观测值和数十个特征的数据集。
通用性: 如果我们想添加另一个特征,比如卧室数量,该怎么办?我们只需在矩阵 A A A 中为该特征添加一列,并在向量 (vector) x x x 中添加一个权重 (weight)。方程 A x ≈ y Ax \approx y A x ≈ y 保持不变。这使得这种方法非常易于扩展。
计算效率: 像 NumPy 这样的数值库经过高度优化,可以执行矩阵运算。使用矩阵代数解决此问题比编写循环逐一迭代方程要快得多。
我们现在已将线性回归表达为一个线性代数问题。我们正在寻找最能解方程 A x = y Ax = y A x = y 的向量 x x x 。由于完美解很少存在,下一步(我们在此不进行求解)涉及使用矩阵运算,如转置和逆,以找到使预测值 (A x Ax A x ) 与实际值 (y y y ) 之间误差最小的向量 x x x 。这种方法正式称为求解“正规方程”,是直接应用你在前几章学到的工具。