数学笔记:最小二乘法(直线拟合)

文章目录

前言

最小二乘法(Least Squares Method)是一种数学优化技术,它的核心思想是:找到一组参数,使得模型预测值与真实值之间的误差平方和最小。

想象你在平面上有一些散点,想画一条直线来拟合这些点。每个点到直线的垂直距离就是"误差"。最小二乘法就是要找到一条直线,让所有点到直线的垂直距离的平方和最小。

公式与使用

针对二维线性分布的数据,我们需要得出一条直线:

y = k x + b y = kx + b y=kx+b

关键的工作就是用一个合适的方法来得到更加贴近现实需求的系数 kb最小二乘法的使用的是原始数据到直线差值(这里指 Δ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.23b=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)方法表现会更好。

相关推荐
wljt2 分钟前
SpringBoot学习笔记五:Spring Boot的web开发
spring boot·笔记·学习
Shadow(⊙o⊙)6 分钟前
C++常见错误解析2.0
开发语言·数据结构·c++·后端·学习·算法
永远不会的CC7 分钟前
研0上岸找实习面试经历
python·算法·面试
帅小伙―苏8 分钟前
力扣483找到字符串中所有字母异位词
算法·leetcode
小O的算法实验室9 分钟前
2022年IEEE TETCI,基于矩阵的进化计算,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
Hello_Embed16 分钟前
嵌入式上位机开发入门(二十八):JSON 与 JsonRPC 入门
网络·笔记·网络协议·tcp/ip·嵌入式
欧米欧17 分钟前
STRING的底层实现
前端·c++·算法
U盘失踪了22 分钟前
Playwright codegen脚本录制
笔记
smj2302_7968265227 分钟前
解决leetcode第3906题统计网格路径中好整数的数目
python·算法·leetcode
KobeSacre29 分钟前
leetcode 树
算法·leetcode·职场和发展