5c4a16dc3a
添加从本地 Markdown 文件导入创建文章的功能,支持文件预览和自动发布选项 新增文章删除命令,支持选择性删除 Halo 文章或本地文件 添加标签和分类管理功能,支持创建、编辑和删除操作 更新国际化文案,支持新功能的多种语言界面 扩展服务层以支持文章导入、删除和标签分类管理 API 调用 更新插件版本至 2.1.1 并更新作者信息
229 lines
8.8 KiB
Markdown
229 lines
8.8 KiB
Markdown
---
|
||
title: Linear Regression 线性回归
|
||
id: 019d86e4-4749-708c-b0ba-240fc8a8dbf8
|
||
date: 2026-04-13 20:50:39
|
||
auther: openknow
|
||
cover:
|
||
excerpt: 线性回归通过建立自变量与因变量之间的线性关系来预测数值,通过最小化平方损失函数求解权重,可采用解析解或梯度下降法优化参数。
|
||
permalink: /archives/linear-regression-xian-xing-hui-gui
|
||
categories:
|
||
- cheng-chang-shi-yan-shi
|
||
tags:
|
||
- ji-shu-shen-qian
|
||
---
|
||
|
||
# Linear Regression 线性回归
|
||
|
||
回归是能为一个或多个自变量与因变量之间关系建模的一类方法。回归经常用来表示输入和输出之间的关系。
|
||
|
||
在机器学习领域中的大多数任务通常都与预测(prediction)有关。当我们想预测一个数值时,就会涉及到回归问题。
|
||
|
||
---
|
||
|
||
## 一、线性回归基本元素
|
||
|
||
假设我们要开发一个能预测房价的模型,我们需要收集一个真实的数据集。这个数据集包括了房屋的销售价格、面积和房龄。
|
||
|
||
在机器学习的术语中,该数据集称为**训练数据集**或**训练集**。
|
||
|
||
每行数据(比如一次房屋交易相对应的数据)称为**样本(sample)**,也可以称为数据点(data point)或数据样本(data instance)。
|
||
|
||
我们把试图预测的目标(比如预测房屋价格)称为**标签或目标**。预测所依据的自变量(面积和房龄)称为**特征或协变量**。
|
||
|
||
我们通常使用 $n$ 来表示数据集中的样本数,对索引为 $i$ 的样本,其输入表示为 $x^{(i)}=\left[x_{1}^{(i)}, x_{2}^{(i)}\right]^{\top}$,其对应标签为 $y^{(i)}$。
|
||
|
||
---
|
||
|
||
## 二、线性模型
|
||
|
||
线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和。
|
||
|
||
$$
|
||
\text{ price}=\omega_{\text{area}}\cdot\text{ area}+\omega_{\text{age}}\cdot\text{ age}+b
|
||
$$
|
||
|
||
其中:
|
||
|
||
- $\omega_{\text{area}}$ 和 $\omega_{\text{age}}$ 称为**权重(weight)**,决定了每个特征对我们预测值的影响
|
||
- $b$ 称为**偏置(bias)**、偏移量(offset)或截距(intercept),也就是噪声项
|
||
|
||
我们的目标是寻找模型的权重 $\omega$ 和偏置 $b$,使得根据模型做出的预测大体符合数据里的真实价格。输出的预测值由输入特征通过线性模型的仿射变换决定,仿射变换由所选权重和偏置确定。
|
||
|
||
### 高维数据集表示
|
||
|
||
对于高维数据集,建模时采用线性代数表示法。输入包含 $d$ 个特征时,我们将预测结果 $\hat{y}$ 表示为:
|
||
|
||
$$
|
||
\hat{y}=\omega_1 x_1+\ldots+\omega_d x_d+b
|
||
$$
|
||
|
||
将所有特征放到向量 $x\in R^d$ 中,将所有权重放到向量 $\omega\in R^d$ 中,得到简洁的点积形式的表达式模型:
|
||
|
||
$$
|
||
\hat{y}=x^{\top}\omega+b
|
||
$$
|
||
|
||
矩阵 $X\in R^{n\times d}$ 可以很方便地引用我们整个数据集的 $n$ 个样本。其中,$X$ 的每一行是一个样本,每一列是一种特征。
|
||
|
||
对于特征集合 $X$,预测值 $\hat{y}\in R^n$ 可以通过矩阵-向量乘法表示为:
|
||
|
||
$$
|
||
\hat{y}=X\omega+b
|
||
$$
|
||
|
||
为了减少少量的观测误差出现,即使确信特征与标签的潜在关系是线性的,我们也会加入一个噪声项来考虑观测误差带来的影响。
|
||
|
||
---
|
||
|
||
## 三、损失函数
|
||
|
||
损失函数量化了目标的真实值与预测值之间的距离。
|
||
|
||
损失通常是一个非负值。数值越小越好,完美的预测会带来 0 损失。对于回归问题,最常见的损失函数是**平方误差**。
|
||
|
||
当我们在样本 $i$ 上的预测值是 $\hat{y}^{(i)}$,对应的真实标签是 $y^{(i)}$ 时,平方误差损失由下式给出:
|
||
|
||
$$
|
||
l^{(i)}(w, b)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^2
|
||
$$
|
||
|
||
> **注:** 常数 $\frac{1}{2}$ 没有实质影响,但在数学表示上很方便,因为当我们对损失求导时,它会被消去。
|
||
|
||
由于二次形式,估计值 $\hat{y}^{(i)}$ 和目标值 $y^{(i)}$ 之间的较大差异会导致对损失更大的贡献(虽然它鼓励模型避免大错误,但也可能导致对异常数据的过度敏感)。
|
||
|
||
为了衡量模型在整个 $n$ 个样本数据集上的质量,我们简单地对训练集上的损失进行平均(或等效地求和):
|
||
|
||
$$
|
||
L(w, b)=\frac{1}{n}\sum_{i=1}^n l^{(i)}(w, b)=\frac{1}{n}\sum_{i=1}^n\frac{1}{2}\left(w^{\top} x^{(i)}+b-y^{(i)}\right)^2
|
||
$$
|
||
|
||
我们寻找能够最小化所有训练样本总损失的参数 $\left(w^*, b^*\right)$:
|
||
|
||
$$
|
||
w^*, b^*=\underset{w, b}{\operatorname{argmin}} L(w, b)
|
||
$$
|
||
|
||
---
|
||
|
||
## 四、求解方法
|
||
|
||
### 4.1 解析解
|
||
|
||
首先在线性回归模型中,我们的目标是找到最优的参数向量 $w$(我们将偏置值 $b$ 合并在 $w$ 中,合并的方法是在包含所有参数的矩阵中附加一列),使得预测值 $Xw$ 与真实值 $y$ 之间的差距最小。
|
||
|
||
这个差距用平方损失(squared error)来衡量,即 $\|y-Xw\|^{2}$,我们的目标就是最小化这个损失函数。
|
||
|
||
由于这个损失函数是"凸函数"(convex function),我们只需要找到那个唯一的坡度为零的点,它就是我们要找的最小值点。
|
||
|
||
#### 推导过程
|
||
|
||
**步骤 1:展开损失函数**
|
||
|
||
$$
|
||
L(w)=\|y-Xw\|^2=(y-Xw)^{T}(y-Xw)
|
||
$$
|
||
|
||
**步骤 2:对 $w$ 求梯度并设为零**
|
||
|
||
$$
|
||
\nabla L(w)=0
|
||
$$
|
||
|
||
**步骤 3:计算梯度**
|
||
|
||
根据矩阵微积分的知识可以直接计算:
|
||
|
||
$$
|
||
\nabla L(w)=2X^{\top}(Xw-y)=0
|
||
$$
|
||
|
||
**步骤 4:解关于 $w$ 的方程**
|
||
|
||
$$
|
||
\begin{align*}
|
||
X^{\top}(Xw-y)&=0\\
|
||
X^{\top}Xw-X^{\top}y&=0\\
|
||
X^{\top}Xw&=X^{\top}y
|
||
\end{align*}
|
||
$$
|
||
|
||
**步骤 5:求解 $w$**
|
||
|
||
现在,只要矩阵 $\left(X^{\top}X\right)$ 是可逆的(通常数据满足这个条件),我们就可以在等式两边同时乘以它的逆矩阵,从而解出:
|
||
|
||
$$
|
||
\begin{align*}
|
||
\left(X^{\top}X\right)^{-1}\left(X^{\top}X\right)w&=\left(X^{\top}X\right)^{-1}X^{\top}y\\
|
||
w&=\left(X^{\top}X\right)^{-1}X^{\top}y
|
||
\end{align*}
|
||
$$
|
||
|
||
我们就得到了**解析解(Analytic Solution)**:
|
||
|
||
> **万能公式:**
|
||
> $$w=\left(X^{\top}X\right)^{-1}X^{\top}y$$
|
||
|
||
#### 解析解的局限性
|
||
|
||
这种求 $w$ 和 $b$ 的方法是暴力求解的,是专门为"线性回归"这种简单的问题设计的,但是现实世界的问题要复杂得多,根本没有这样一个现成的公式。
|
||
|
||
并且其计算量巨大,计算太慢。因此接下来要介绍的是一种更高效的方法,靠"试"和"猜"的思路,即**梯度下降法**。
|
||
|
||
---
|
||
|
||
### 4.2 小批量随机梯度下降法
|
||
|
||
#### 基本思想
|
||
|
||
随机梯度下降法简单理解:假设我们要寻找一个一元函数 $f(x)$ 的最小值点。
|
||
|
||
用梯度下降的方法就是,先假设在一点 $x_0$ 处函数值最小,然后求出导数 $f^{\prime}\left(x_0\right)$,如果导数大于零,就说明函数在 $x_0$ 处是单调递增的。
|
||
|
||
因此我们要根据导数的正负去修改 $x_0$ 的方向,如果导数大于零,那么对 $x_0$ 进行减操作。反之则进行加操作,以此不断逼近函数的最小值。
|
||
|
||
那么如何确定移动的步长呢?最简单的就是取函数的导数值的大小,$x_0$ 就不断地以 $x_0-f^{\prime}\left(x_0\right)$ 进行更新。
|
||
|
||
#### 学习率
|
||
|
||
以导数值的大小作为步长看起来不错,但是实际上还需要乘以一个步长的系数。
|
||
|
||
步长系数更正式的名字叫做**学习率(Learning Rate)**。因为导数值并不是总是那么合适:
|
||
|
||
- 有时候偏大,导致步长太大,跳过全局最小值
|
||
- 有时候偏小,导致训练过程很慢
|
||
|
||
这时就可以通过设置学习率来调整。一般情况下,学习率都是小于 1 的。比如设置为 0.001。
|
||
|
||
#### 多元函数的更新公式
|
||
|
||
经过上面以一元函数为例对随机梯度下降法的简单分析,下面我们直接给出多元函数的随机梯度下降的更新公式:
|
||
|
||
$$
|
||
(w, b)\leftarrow(w, b)-\frac{\eta}{|\mathcal{B}|}\sum_{i\in\mathcal{B}}\partial_{(w, b)} l^{(i)}(w, b)
|
||
$$
|
||
|
||
其中:
|
||
|
||
| 符号 | 含义 |
|
||
|------|------|
|
||
| $\eta$ | 步长系数,即学习率 |
|
||
| $\mathcal{B}$ | 小批量样本。因为在每一次更新参数之前,我们必须遍历整个数据集,实际中的执行可能会非常慢。因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本,它是由固定数量的训练样本组成的 |
|
||
| $\partial_{w, b} l^{(i)}(w, b)$ | 第 $i$ 个样本的损失函数对 $w$ 和 $b$ 的偏导数 |
|
||
|
||
---
|
||
|
||
## 五、总结
|
||
|
||
在机器学习领域,在训练过程中由算法调整的变量叫做**参数**。
|
||
|
||
- 参数是通过数据学习而来的,不是人为设定的
|
||
- 参数决定了模型如何从输入数据映射到输出
|
||
|
||
**超参数**是模型训练前需要人为设置的变量,它们不会在训练过程中自动学习,而是由人根据实验或者经验设定的。比如学习率就是一个超参数。
|
||
|
||
线性回归恰好是一个在整个域中只有一个最小值的学习问题。
|
||
|
||
但是对像深度神经网络这样复杂的模型来说,损失平面上通常包含多个最小值。
|
||
|
||
我们很难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失,这一挑战被称为**泛化(generalization)**。
|