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

文章目录

前言

最小二乘法(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)方法表现会更好。

相关推荐
careathers10 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
Rabitebla10 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi11 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅11 小时前
算法(1) 动态规划
算法·动态规划
青少儿编程课堂11 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
叼烟扛炮11 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
景煜拾年11 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
旖旎夜光11 小时前
【C++ 基础入门】类和对象(下):初始化列表、static 成员、友元与内部类
c++·笔记·学习
LONGZHIQIN12 小时前
STM32学习笔记
笔记·stm32·学习·arm
叼烟扛炮12 小时前
[LangChain] 学习笔记(04):手搓 ChatGPT 打字机——流式输出(SSE)与模型初始化选型
人工智能·笔记·chatgpt·langchain