本文最后更新于:2024年9月20日 下午

故名思意,线性回归是一种线性模型,线性模型形式简单、易于建模。许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或者高维映射而得。本文记录最基本的线性回归方法。

问题描述

考虑一个线性模型 ${y}=f({\bf{x}})$

其中$y$是模型的输出值,是标量,$\bf{x}$为$d$维实数空间的向量

  • 线性模型可以表示为:

$$
f(\bf{x})=\bf{w} ^Tx,w\in \mathbb{R}
$$

  • 线性回归的任务是利用$n$个训练样本:
$$ X=\left[\begin{array}{lll}\bf{x}_{1} & \cdots & \bf{x}_{n}\end{array}\right]^{T}=\left[\begin{array}{c}\bf{x}_{1}^{T} \\ \vdots \\ \bf{x}_{n}^{T}\end{array}\right] \quad \bf{x} \in \mathbb{R} $$
  • 和样本对应的标签:

$$
Y = [ y _ { 1 } \cdots \quad y _ { n } ] ^ { T } \quad y \in \mathbb{R}
$$

  • 来预测线性模型中的参数 $\bf{\omega}$,使得模型尽可能准确输出预测值

线性回归 / 最小二乘法

  • 定义损失函数:
$$ L(w)=\sum_{i=1}^{n}\left(w^{T} x_{i}-y_{i}\right)^{2} $$
  • 推导损失函数:
$$ \begin{aligned} L(w) &=\sum_{i=1}^{n}\left(w^{T} x_{i}-y_{i}\right)^{2} \\ &=\left(w^{T} x_{1}-y_{1}\right)^{2}+\left(w^{T} x_{2}-y_{2}\right)^{2}+\ldots+\left(w^{T} x_{n}-y_{n}\right)^{2} \\ &=[w^{T} x_{1}-y_{1} , \cdots ,w^{T} x_{n}-y_{n}]\left[\begin{array} & w^{T} x_{1}-y_{1} \\ \vdots \\ w^{T} x_{n}-y_{n}\end{array}\right] \\ &=\left(w^{T}\left[\begin{array}{lll}x_{1} & \cdots & x_{n}\end{array}\right]-Y^{T}\right)\left(\left[\begin{array}{c}x_{1}^{T} \\ \vdots \\ x_{n}^{T}\end{array}\right] w-Y\right) \\ &=\left(w^{T} X^{T}-Y^{T}\right)(X w-Y) \\ &=w^{T} X^{T} X w-w^{T} X^{T} Y-Y^{T} X w+Y^{T} Y \\ &=w^{T} X^{T} X w-2 w^{T} X^{T} Y+Y^{T} Y \\ \end{aligned} $$
  • 优化方程:
$$ \begin{aligned} \hat{w} &=\arg \min _{w} L(w) \\ &=\arg \min _{w} w^{T} X^{T} X w-2 w^{T} X^{T} Y+Y^{T} Y \\ &=\arg \min _{w} w^{T} X^{T} X w-2 w^{T} X^{T} Y \end{aligned} $$
  • 求导并令倒数为 0:

$$
\frac{\partial L(w)}{\partial w}=2 X^{T} X w-2 X^{T} Y=0
$$

  • 得到:

$$
X^{T} X w=X^{T} Y \Rightarrow \hat{w}=\left(X^{T} X\right)^{-1} X^{T} Y
$$

numpy 实现

假设需要用 5 个点,用 python 的 numpy 实现最小二乘法拟合一个三维二次曲面:
$$
z = ax2+by2+cxy+dx+ey+f
$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
from numpy.linalg import lstsq

def cal_z(coefficients, x ,y):
a, b, c, d, e, f = coefficients
return a * x**2 + b * y**2 + c * x * y + d * x + e * y + f

# 假设你有以下五个点
points = np.array([
[x1, y1, z1],
[x2, y2, z2],
[x3, y3, z3],
[x4, y4, z4],
[x5, y5, z5]
])

# 构建设计矩阵 A 和结果向量 b
A = np.c_[points[:, 0]**2, points[:, 1]**2, points[:, 0]*points[:, 1], points[:, 0], points[:, 1], np.ones(5)]
b = points[:, 2]

# 使用最小二乘法求解系数
coefficients, _, _, _ = lstsq(A, b, rcond=None)

# 输出系数
a, b, c, d, e, f = coefficients
print(f'二次曲面方程: z = {a:.2f}x^2 + {b:.2f}y^2 + {c:.2f}xy + {d:.2f}x + {e:.2f}y + {f:.2f}')
print(cal_z(xq, yq))

通常,为了得到更可靠的拟合结果,可以使用更多的数据点。

参考资料



文章链接:
https://www.zywvvd.com/notes/study/math/regression/linear-regression/linear-regression/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

线性回归 - 最小二乘法
https://www.zywvvd.com/notes/study/math/regression/linear-regression/linear-regression/
作者
Yiwei Zhang
发布于
2021年5月20日
许可协议