Files
Obsidian/博客/机器学习/LinearRegression线性回归.md
T

229 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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)**。