Featured image of post 机器学习基础:线性回归模型

机器学习基础:线性回归模型

从房价预测与模型函数出发,系统梳理线性回归中的训练集符号、参数作用、成本函数和梯度下降

线性回归是机器学习里最适合入门的模型之一:它足够简单,可以把输入、预测、参数、成本函数这些核心概念讲清楚;它也足够重要,因为后续更复杂的模型训练,仍然离不开这些基本思想。本篇整理 Coursera 机器学习课程中的线性回归内容,从房价预测案例出发,梳理模型函数、训练数据、成本函数和梯度下降之间的关系。

线性回归的基本概念

线性回归(Linear Regression) 是一种监督学习模型,通过为数据拟合一条直线来预测连续数值。

以房价预测为例:

  • 输入 x:房屋面积
  • 输出 y:房屋价格
  • 模型:一条尽可能贴合训练数据的直线

可将模型表示为:

$$\hat{y} = f_{w,b}(x) = wx + b$$

其中:

  • $x$:输入特征,例如房屋面积
  • $\hat{y}$:模型预测的房屋价格
  • $w$:直线的斜率
  • $b$:直线的截距

因为只有一个输入特征,这种模型称为单变量线性回归(Univariate Linear Regression)。“单变量”表示模型只有一个输入变量,而不是只有一个参数,该模型仍然包含两个参数 $w$ 和 $b$。

以后还可以使用多个输入特征预测房价,例如房屋面积、卧室数量、浴室数量、房屋年龄、地理位置等,属于多变量或多特征线性回归。

训练集与符号约定

训练集

用于训练模型的数据称为训练集(Training Set)

房价预测的训练数据来自美国波特兰市,包含:

  • 房屋面积,单位为平方英尺
  • 房屋售价,单位为千美元

同一组数据可以通过两种方式表示:

散点图:横轴为房屋面积,纵轴为房屋价格,每个数据点对应一套已售房屋。如果训练集有 47 套房屋,图中就有 47 个数据点。

数据表

房屋面积(平方英尺)房屋价格(千美元)
2104400

表格中的每一行对应一个训练示例,也对应散点图中的一个数据点。例如面积 2104 平方英尺,售价 400 千美元,即 400,000 美元。

符号约定

符号含义房价示例
$x$输入特征(Feature)房屋面积
$y$真实值(Label / Target Variable)房屋实际售价
$\hat{y}$模型预测值预测房价
$f_{w,b}(x)$参数为 $w, b$ 的模型对 $x$ 的预测$\hat{y} = wx + b$
$m$训练样本总数47
$(x^{(i)}, y^{(i)})$第 $i$ 个训练样本$(2104, 400)$

一个完整的训练示例由输入和正确输出组成 $(x, y)$。第 $i$ 个训练示例表示为 $(x^{(i)}, y^{(i)})$,其中 $x^{(i)}$ 是第 $i$ 个样本的输入,$y^{(i)}$ 是第 $i$ 个样本的正确输出。

需要特别注意:$x^{(2)}$ 表示“第二个训练示例的输入”,不是 $x$ 的平方。括号中的上标只是训练样本的编号。

为什么称为监督学习

训练集中同时提供了输入(房屋面积)和正确输出(房屋实际售价)。每套已售房屋的数据都相当于向模型提供一个带答案的学习示例,因此这种学习方式称为“监督学习”。

基本流程:

  1. 收集包含输入和正确输出的数据
  2. 使用这些数据训练模型
  3. 模型学习输入与输出之间的规律
  4. 将新输入交给模型
  5. 模型预测相应的输出

参数 $w$ 和 $b$ 的作用

斜率 $w$

$w$ 决定直线的倾斜程度:

w > 0:直线向右上方倾斜,x 增大时预测值增大
w = 0:直线是水平的,预测值不随 x 变化
w < 0:直线向右下方倾斜,x 增大时预测值减小

在房价问题中,$w$ 可以理解为房屋面积每增加一个单位,预测价格增加多少。$w$ 也称为权重或系数。

截距 $b$

$b$ 决定直线与纵轴的交点。当 $x = 0$ 时:

$$f(0) = b$$

因此 $b$ 是模型在输入为零时的预测值。

示例

当 $w = 0, b = 1.5$ 时:

$$f(x) = 1.5$$

无论输入是多少,预测结果始终为 1.5。

当 $w = 0.5, b = 0$ 时:

$$f(x) = 0.5x$$

直线斜率为 0.5,经过原点。

当 $w = 0.5, b = 1$ 时:

$$f(x) = 0.5x + 1$$

直线斜率仍为 0.5,但与纵轴相交于 1。

假设 $f(x) = 0.1x + 50$,当房屋面积为 1250 平方英尺时:

$$\hat{y} = 0.1 \times 1250 + 50 = 175$$

预测价格为 175,000 美元。

不同的 $w$ 和 $b$ 会形成不同的直线,也会产生不同的预测结果。

学习算法的任务

训练线性回归模型的核心任务,是根据训练数据选择合适的 $w$ 和 $b$,使直线尽可能贴近数据点。

完整过程可以表示为:

$$\{(x^{(i)}, y^{(i)})\}_{i=1}^{m} \longrightarrow \text{学习算法} \longrightarrow w, b \longrightarrow f_{w,b}(x)$$

也就是说:

  1. 将训练数据交给学习算法
  2. 学习算法寻找合适的 $w$ 和 $b$
  3. 得到模型 $f_{w,b}(x) = wx + b$
  4. 用模型预测新输入对应的 $\hat{y}$

客户的房屋尚未出售,因此其真实价格不在训练集中。模型需要先从已售房屋的数据中学习,再预测这套房屋的价格。

$y$ 与 $\hat{y}$ 的区别

$y$:实际目标值

$y$ 表示训练数据中的真实答案。例如 $y = 400$ 表示某套房屋的实际售价为 400 千美元。

$\hat{y}$:预测值

$\hat{y}$ 读作 “y hat”,表示模型对 $y$ 的估计:

$$\hat{y} = f_{w,b}(x) = wx + b$$

预测值不一定等于实际值:

$$\hat{y} \neq y$$

例如,模型预测某套房屋售价为 220,000 美元,但只有房屋真正售出后,才能知道真实售价 $y$。

需要明确区分:

$$\boxed{y = \text{真实值}, \qquad \hat{y} = \text{预测值}}$$

成本函数

为什么需要成本函数

不同的 $w$ 和 $b$ 会产生不同的直线。成本函数的作用是:

衡量一组 $w, b$ 所产生的直线,对训练数据拟合得有多好。

成本越小,通常说明预测值越接近真实值。

预测误差

对于第 $i$ 个训练样本 $(x^{(i)}, y^{(i)})$,模型预测值为:

$$\hat{y}^{(i)} = f_{w,b}(x^{(i)})$$

预测误差为:

$$\hat{y}^{(i)} - y^{(i)} = \text{预测值} - \text{真实值}$$

例如,模型预测价格为 280,真实价格为 300:

$$280 - 300 = -20$$

误差为 $-20$,表示模型低估了价格。

平方误差成本函数

线性回归常用的成本函数是平方误差成本函数

$$\boxed{J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} \left(f_{w,b}(x^{(i)}) - y^{(i)}\right)^2}$$

也可以写成:

$$J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} \left(\hat{y}^{(i)} - y^{(i)}\right)^2$$

计算过程:

  1. 计算每个样本的预测值
  2. 用预测值减去真实值
  3. 将误差平方
  4. 把所有平方误差相加
  5. 除以 $2m$

为什么误差要平方

如果直接将误差相加,正负误差可能互相抵消:

$$(-20) + 20 = 0$$

但模型实际产生了两次误差。平方以后:

$$(-20)^2 + 20^2 = 800$$

因此:

  • 所有误差都会变成非负数
  • 较大的误差会受到更明显的惩罚
  • 成本不会因为正负抵消而错误地变小

为什么除以 $m$ 和 $2$

除以 $m$:$m$ 是训练样本数量。除以 $m$ 相当于计算平均误差,使成本不会仅仅因为训练数据变多而自动增大。

再除以 $2$:主要是为了让后续求导和梯度下降的公式更简洁。是否除以 $2$ 不会改变最佳参数的位置。

成本函数的直观示例

为了方便观察,暂时令 $b = 0$,模型简化为:

$$f_w(x) = wx$$

训练集为:

$$(1, 1), \quad (2, 2), \quad (3, 3)$$

当 $w = 1$

预测值为 1, 2, 3,全部等于真实值:

$$J(1) = 0$$

模型完美拟合训练数据。

当 $w = 0.5$

预测值为 0.5, 1, 1.5。平方误差为:

$$(0.5-1)^2 + (1-2)^2 + (1.5-3)^2 = 0.25 + 1 + 2.25 = 3.5$$$$J(0.5) = \frac{3.5}{2 \times 3} \approx 0.58$$

当 $w = 0$

所有预测值都是 0:

$$J(0) = \frac{1^2 + 2^2 + 3^2}{6} = \frac{14}{6} \approx 2.33$$

当 $w = -0.5$

直线方向与数据趋势相反:

$$J(-0.5) = 5.25$$

结果对比

$w$$J(w)$拟合情况
$-0.5$$5.25$很差
$0$$2.33$较差
$0.5$$0.58$较好
$1$$0$最佳

这个例子中的最佳参数是 $w = 1$。

模型函数与成本函数的区别

两者容易混淆,需要明确区分:

模型函数 $f_{w,b}(x) = wx + b$

  • 输入是 $x$(特征),输出是预测值 $\hat{y}$
  • 模型图的坐标轴:横轴 $x$(房屋面积),纵轴 $y$ 或 $\hat{y}$(价格)
  • 回答的问题:“这套房子预测多少钱?”

成本函数 $J(w,b)$

  • 输入是模型参数 $w, b$,输出是模型的成本
  • 成本图的坐标轴是参数和成本,而不是房屋面积与价格
  • 回答的问题:“这组模型参数整体表现有多差?”

成本函数的图像

只有参数 $w$ 时($b = 0$)

成本函数只有一个参数 $J(w)$,通常呈 U 形曲线:

成本 J
  | \       /
  |  \_____/
  +------------→ w
        最小值

最低点对应成本最小的 $w$。

同时使用 $w$ 和 $b$ 时

完整模型包含两个参数 $J(w,b)$,这时成本函数是一个三维曲面,通常类似碗形:

  • 一个方向代表 $w$
  • 一个方向代表 $b$
  • 曲面的高度代表成本 $J(w,b)$

碗底对应成本函数的最小值,也就是最佳的 $w, b$。

等高线图

三维成本函数也可以用二维的等高线图表示。每条椭圆线表示成本相同的一组 $w, b$:

$$J(w_1, b_1) = J(w_2, b_2)$$

可以把等高线图理解成从正上方观察碗形曲面:

  • 外层椭圆:成本通常较高
  • 越靠近中心:成本通常越低
  • 最内层椭圆中心:成本最小值附近

不同的 $w, b$ 即使成本相同,也可能对应不同的模型直线。

训练目标与梯度下降

训练目标

线性回归最终需要解决的问题是:

$$\boxed{\min_{w,b} J(w,b)}$$

也就是找到一组 $w, b$,使成本函数尽可能小。

完整逻辑:

选择 w, b
得到直线 f(x) = wx + b
计算每个样本的预测误差
计算成本 J(w,b)
不断调整 w, b
找到成本最小的参数

为什么需要梯度下降

理论上可以手动尝试很多组 $w, b$,计算每一组参数的成本,再选择成本最低的一组。但这种方法效率非常低,当模型参数很多时,几乎无法手动完成。

因此需要一种能够自动调整参数、寻找成本函数最小值的算法:

$$\boxed{\text{梯度下降(Gradient Descent)}}$$

梯度下降不仅用于线性回归,也是训练神经网络和许多复杂人工智能模型的基础算法。

成本函数的代码实现

def compute_cost(x, y, w, b):
    m = x.shape[0]                      # 训练样本数量

    cost_sum = 0
    for i in range(m):
        f_wb = w * x[i] + b             # 第 i 个样本的预测值
        cost = (f_wb - y[i]) ** 2       # 平方误差
        cost_sum = cost_sum + cost       # 累加

    total_cost = cost_sum / (2 * m)      # 计算平均成本
    return total_cost

逐步理解:

  • m = x.shape[0]:获取训练样本数量
  • cost_sum = 0:准备变量,累计所有样本的平方误差
  • for i in range(m):逐个处理训练样本
  • f_wb = w * x[i] + b:计算预测值 $\hat{y}^{(i)} = wx^{(i)} + b$
  • cost = (f_wb - y[i]) ** 2:计算预测值和真实价格的平方误差
  • cost_sum = cost_sum + cost:把当前样本的误差加入总误差
  • total_cost = cost_sum / (2 * m):按照成本函数公式计算最终成本

对应公式:

$$J(w,b) = \frac{1}{2m} \sum_{i=0}^{m-1} \left(wx^{(i)} + b - y^{(i)}\right)^2$$

验证示例

import numpy as np

x_train = np.array([1.0, 2.0])
y_train = np.array([300.0, 500.0])

w = 200
b = 100

两个预测分别是:

$$200 \times 1 + 100 = 300$$$$200 \times 2 + 100 = 500$$

预测值与真实值完全相同:

compute_cost(x_train, y_train, 200, 100)  # 结果:0.0

这说明 $w = 200, b = 100$ 能完美拟合这两个数据点。

关键理解

  1. compute_cost() 只负责评价一组 $w, b$ 好不好
  2. 成本越小,模型对训练数据的拟合通常越好
  3. 两个点可以被一条直线完美穿过,因此成本可以为零;多个不共线的数据点无法全部完美命中,因此最低成本通常大于零

为什么先学线性模型

现实中的数据关系不一定是直线,也可能是曲线、抛物线或更复杂的非线性关系。但线性模型具有以下优点:

  • 数学形式简单
  • 容易理解和实现
  • 便于观察模型参数的作用
  • 是学习复杂机器学习模型的基础

因此,课程首先从线性函数入手,之后再扩展到非线性模型。