文章目录
前言
最小二乘法(Least Squares Method)是一种数学优化技术,它的核心思想是:找到一组参数,使得模型预测值与真实值之间的误差平方和最小。
想象你在平面上有一些散点,想画一条直线来拟合这些点。每个点到直线的垂直距离就是"误差"。最小二乘法就是要找到一条直线,让所有点到直线的垂直距离的平方和最小。

公式与使用
针对二维线性分布的数据,我们需要得出一条直线:
y = k x + b y = kx + b y=kx+b
关键的工作就是用一个合适的方法来得到更加贴近现实需求的系数 k 和 b 。最小二乘法的使用的是原始数据到直线差值(这里指 Δy )的平方和最小。
可以推导出结果如下:
k = n ∑ x i y i − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 k = \frac{n \sum x_i y_i - \sum x_i \sum y_i}{n \sum x_i^2 - (\sum x_i)^2} k=n∑xi2−(∑xi)2n∑xiyi−∑xi∑yi
b = ∑ x i 2 ∑ y i − ∑ x i ∑ x i y i n ∑ x i 2 − ( ∑ x i ) 2 b = \frac{\sum x_i^2 \sum y_i - \sum x_i \sum x_i y_i}{n \sum x_i^2 - (\sum x_i)^2} b=n∑xi2−(∑xi)2∑xi2∑yi−∑xi∑xiyi
n 是数据点的个数, ∑ x i 表示所有 x i 的和, ∑ y i 表示所有 y i 的和, ∑ x i 2 表示所有 x i 2 的和, ∑ x i y i 表示所有 x i y i 的和。 n 是数据点的个数,\sum x_i 表示所有 x_i 的和,\sum y_i 表示所有 y_i 的和,\\ \sum x_i^2 表示所有 x_i^2 的和,\sum x_i y_i 表示所有 x_i y_i 的和。 n是数据点的个数,∑xi表示所有xi的和,∑yi表示所有yi的和,∑xi2表示所有xi2的和,∑xiyi表示所有xiyi的和。
示例计算
现有数据(x, y) :(2, 2.2) (3, 3.8) (4, 5.5) (5, 6.5) (6, 7.0)。
可以计算出中间数据:

然后带入前面公式计算出 k=1.23 和 b=0.08 。
代码实现(Python)
python
import numpy as np
import matplotlib.pyplot as plt
# 示例数据
points = [(2, 2.2), (3, 3.8), (4, 5.5), (5, 6.5), (6, 7.0)]
x = np.array([p[0] for p in points])
y = np.array([p[1] for p in points])
# 计算参数k和b
# 方法一
n = len(x)
sum_x = np.sum(x)
sum_y = np.sum(y)
sum_x2 = np.sum(x**2)
sum_xy = np.sum(x * y)
k = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x**2)
b = (sum_x2 * sum_y - sum_x * sum_xy) / (n * sum_x2 - sum_x**2)
# 方法二
# p = np.polyfit(x, y, 1) # 线性拟合
# k, b = p
# 输出结果
print(f'm = {k}')
print(f'b = {b}')
# 绘制数据
y_fit = k * x + b
plt.scatter(x, y, color='blue')
plt.plot(x, y_fit, color='red', label=f'y = {k:.2f}x + {b:.2f}')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

缺点
最小二乘法有完整的统计理论支持,计算简单,但是对数据中的异常值很敏感(平方项放大了异常值的影响)。这种情况下稳健回归(Theil Sen,RANSAC,Huber)方法表现会更好。