问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

最小二乘法(OLS):原理、推导与实现

创作时间:
作者:
@小白创作中心

最小二乘法(OLS):原理、推导与实现

引用
CSDN
1.
https://m.blog.csdn.net/qq_38614074/article/details/136801574

最小二乘法是一种常用的数据拟合方法,它可以通过最小化残差平方和来找到数据的最佳拟合线。本文将详细介绍最小二乘法的原理、推导过程以及Python实现,帮助读者深入理解这一重要的机器学习算法。

1. 模型及方程组的矩阵形式改写

首先,我们对线性模型 (f(x) = w_1x_1 + w_2x_2 + \ldots + w_dx_d + b) 进行矩阵形式改写。

  • 模型改写为矩阵表达式

假设多元线性方程有如下形式:
[f(x) = w_1x_1 + w_2x_2 + \ldots + w_dx_d + b]

令 (w = [w_1, w_2, \ldots, w_d]^T),(x = [x_1, x_2, \ldots, x_d]^T),则上式可写为:
[f(x) = w^Tx + b]

  • 将带入数据后的方程组改写为矩阵方程

假设现在总共有 (m) 条观测值,(x^{(i)} = [x_1^{(i)}, x_2^{(i)}, \ldots, x_d^{(i)}]),则带入模型可构成 (m) 个方程。

首先,我们定义:
[\hat{w} = [w_1, w_2, \ldots, w_d, b]^T]
[\hat{x} = [x_1, x_2, \ldots, x_d, 1]^T]

构造特征矩阵 (\hat{X}) 和标签向量 (y):
[\hat{X} = \begin{bmatrix}
x_1^{(1)} & x_2^{(1)} & \ldots & x_d^{(1)} & 1 \
x_1^{(2)} & x_2^{(2)} & \ldots & x_d^{(2)} & 1 \
\vdots & \vdots & \ddots & \vdots & \vdots \
x_1^{(m)} & x_2^{(m)} & \ldots & x_d^{(m)} & 1 \
\end{bmatrix}]
[y = \begin{bmatrix}
y_1 \
y_2 \
\vdots \
y_m \
\end{bmatrix}]

因此,上述方程组可表示为:
[\hat{X} \cdot \hat{w} = \hat{y}]

  • 模型进一步改写

在改写了 (\hat{x}) 和 (\hat{w}) 之后,线性模型也可以按照如下形式进行改写:
[f(\hat{x}) = \hat{w}^T \cdot \hat{x}]

2. 构造损失函数

在方程组的矩阵表示基础上,我们可以以SSE(残差平方和)作为损失函数的基本计算流程,构建关于 (\hat{w}) 的损失函数:
[SSELoss(\hat{w}) = ||y - X\hat{w}||_2^2 = (y - X\hat{w})^T(y - X\hat{w})]

需要补充两点基础知识:

  • 向量的2-范数计算公式

上式中,(||y - X\hat{w}^T||_2) 为向量的2-范数的计算表达式。向量的2-范数计算过程为各分量求平方和再进行开平方。例如 (a = [1, -1]),则 (||a||_2 = \sqrt{1^2 + (-1)^2} = \sqrt{2})。

  • 2-范数计算转化为内积运算

向量的2-范数计算结果其实就是向量(将其视为矩阵)的交叉乘积计算结果后开平方。例如,(a = [1, -1]),则 (a \cdot a^T = [1, -1] \cdot \begin{bmatrix} 1 \ -1 \end{bmatrix} = 2),开平方后等于其2-范数计算结果。

3. 最小二乘法求解损失函数的一般过程

在确定损失函数的矩阵表示形式之后,接下来即可利用最小二乘法进行求解。其基本求解思路仍然是先求导函数、再令导函数取值为零,进而解出参数取值。只不过此时求解的是矩阵方程。

在此之前,需要补充两点矩阵转置的运算规则:

  • ((A - B)^T = A^T - B^T)
  • ((AB)^T = B^TA^T)

接下来,对 (SSELoss(\hat{w})) 求导并令其等于0:

[
\begin{aligned}
\frac{\partial SSELoss(\hat{w})}{\partial \hat{w}} &= \frac{\partial ||y - X\hat{w}||_2^2}{\partial \hat{w}} \
&= \frac{\partial (y - X\hat{w})^T(y - X\hat{w})}{\partial \hat{w}} \
&= \frac{\partial (y^T - \hat{w}^TX^T)(y - X\hat{w})}{\partial \hat{w}} \
&= \frac{\partial (y^Ty - \hat{w}^TX^Ty - y^TX\hat{w} + \hat{w}^TX^TX\hat{w})}{\partial \hat{w}} \
&= 0 - X^Ty - X^Ty + X^TX\hat{w} + (X^TX)^T\hat{w} \
&= 0 - X^Ty - X^Ty + 2X^TX\hat{w} \
&= 2(X^TX\hat{w} - X^Ty) = 0
\end{aligned}
]

即:
[X^TX\hat{w} = X^Ty]

要使得此式有解,等价于 (X^TX)(也被称为矩阵的交叉乘积crossprod)存在逆矩阵,若存在,则可解出:
[\hat{w} = (X^TX)^{-1}X^Ty]

4. 最小二乘法的简单实现(Python实现)

现在我们将使用Python来实现最小二乘法,并拟合一组数据点。

首先,导入必要的库:

import numpy as np

接下来,定义数据点:

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 5, 6, 8])

然后,计算最小二乘法的参数:

n = len(x)
m = (n * np.sum(x * y) - np.sum(x) * np.sum(y)) / (n * np.sum(x**2) - np.sum(x)**2)
b = (np.sum(y) - m * np.sum(x)) / n

最后,打印拟合的直线方程:

print(f"拟合直线方程:y = {m}x + {b}")

运行代码,将得到拟合的直线方程。

补充阅读:简单线性回归方程的参数计算

如果是简单线性回归,方程组形式也可快速推导自变量系数与截距。在简单线性回归中,(w) 只包含一个分量,(x) 也只包含一个分量,我们令此时的 (x_i) 就是对应的自变量的取值,此时求解过程如下:

损失函数为:
[SSELoss = \sum_{i=1}^m (f(x_i) - y_i)^2]

通过偏导为零求得最终结果的最小二乘法求解过程为:
[
\begin{align}
\frac{\partial SSE(w,b)}{\partial w} &= 2(w\sum_{i=1}^m x_i^2 - \sum_{i=1}^m (y_i - b)x_i) = 0 \
\frac{\partial SSE(w,b)}{\partial b} &= 2(mb - \sum_{i=1}^m (y_i - wx_i)) = 0
\end{align}
]

进而可得:
[w = \frac{\sum_{i=1}^m y_i(x_i - \bar{x})}{\sum_{i=1}^m x_i^2 - \frac{1}{m}(\sum_{i=1}^m x_i)^2}]
[b = \frac{1}{m}\sum_{i=1}^m (y_i - wx_i)]

其中,(\bar{x} = \frac{1}{m}\sum_{i=1}^m x_i),(x_i) 为 (x) 的均值,并且 ((x_i, y_i)) 代表二维空间中的点。此外,我们也可以通过前文介绍的 (\hat{w} = (X^TX)^{-1}X^Ty) 结论,通过设置 (w) 为两个分量的参数向量反向求解对应方程表达式来进行求解。

补充阅读:简单线性回归的“线性”与“回归”形象理解

对于简单线性回归来说,由于模型可以简单表示为 (y = wx + b) 形式,因此我们可以用二维平面图像来进行对应方程的函数图像绘制。例如,当模型为 (y = x + 1) 时,函数图像如下所示:

import matplotlib as mpl
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.1)
y = x + 1
plt.plot(x, y, '-', label='y=x+1')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc = 2)

于此同时,我们的建模数据为:

Whole weight  Rings
1  2
3  4

将特征视为 (x)、将标签视为 (y),则绘制图像可得:

绘制对应位置元素点图:

A = np.arange(1, 5).reshape(2, 2)
plt.plot(A[:,0], A[:, 1], 'ro')
# 线性回归直线
plt.plot(x, y, '-', label='y=x+1')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc = 2)

由于模型方程是基于满足数据中 (x) 和 (y) 基本关系构建的,因此模型这条直线最终将穿过这两个点。而简单线性回归的几何意义,就是希望找到一条直线,尽可能的接近样本点。或者说,我们是通过一条直线去捕捉平面当中的点。当然,大多数情况下我们都无法对平面中的点进行完全的捕捉,而直线和点之间的差值,实际上就是SSE。

而线性回归中回归的含义,则是:如果模型真实有效,则新数据也会像朝向这条直线“回归”一样,最终分布在这条直线附近。这就是简单线性回归中的“线性”和“回归”的形象理解。

当然,对于线性回归中的参数 (b),其实是bias(偏差或者截距)的简写,当 (x) 去职位0时,(y=b),就好像直线在 (y) 轴上的截距,或者距离 (y=0) 的偏差。

形象理解只是辅助理解,若要从机器学习角度建好一个线性回归模型,需要从特征加权求和汇总角度理解模型本质。


© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号
最小二乘法(OLS):原理、推导与实现