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

文章目录

前言

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

相关推荐
一只齐刘海的猫4 小时前
【Leetcode】找到字符串中所有字母异位词
算法·leetcode·职场和发展
海清河晏1115 小时前
数据结构 | 八大排序
数据结构·算法·排序算法
IronMurphy6 小时前
【算法五十七】146. LRU 缓存
算法·缓存
三品吉他手会点灯6 小时前
STM32F103 学习笔记-24-I2C-读写EEPROM(第1节)-I2C物理层介绍
笔记·stm32·学习
凌波粒6 小时前
LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
算法·leetcode·职场和发展
liulilittle6 小时前
KCC:在 BBR 思路上的一次探索
网络·tcp/ip·算法·bbr·通信·拥塞控制·kcc
浦信仿真大讲堂7 小时前
达索系统SIMULIA Abaqus 2026接触和约束的增强新功能介绍
人工智能·python·算法·仿真软件·达索软件
万物更新_7 小时前
vue框架
前端·javascript·vue.js·笔记
点云侠7 小时前
PCL 生成三棱锥点云
c++·算法·最小二乘法