最小二乘法(Least Squares Method)是一种用于拟合数据的常用方法,它通过最小化观测数据与模型预测值之间的误差的平方和来找到最佳拟合参数。下面是使用Python实现最小二乘法的代码示例。
我们将以一元线性回归(即拟合一条直线)为例。假设我们有一组数据点 (x1,y1),(x2,y2),…,(xn,yn)(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)(x1,y1),(x2,y2),…,(xn,yn),我们希望拟合一条直线 y=mx+by = mx + by=mx+b。
Python代码实现
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 3 * x + 7 + np.random.normal(0, 1, x.shape)
# 最小二乘法计算
# 构造设计矩阵
X = np.vstack([x, np.ones(len(x))]).T
# 使用最小二乘法求解参数
m, b = np.linalg.lstsq(X, y, rcond=None)[0]
# 输出结果
print(f"拟合直线的斜率 m = {m:.2f}")
print(f"拟合直线的截距 b = {b:.2f}")
# 绘制结果
plt.scatter(x, y, label='Data points')
plt.plot(x, m*x + b, 'r', label='Fitted line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
代码说明
-
数据生成:
- 我们生成了一些随机数据点,遵循 y=3x+7y = 3x + 7y=3x+7 的直线并加入了一些噪声。
-
最小二乘法:
- 构造设计矩阵
X
,它包括输入x
和一个全为1的列向量(用于计算截距)。 - 使用
numpy.linalg.lstsq
函数计算最小二乘解,它返回一组参数,其中包含斜率m
和截距b
。
- 构造设计矩阵
-
结果输出:
- 打印拟合直线的斜率
m
和截距b
。 - 绘制原始数据点和拟合的直线。
- 打印拟合直线的斜率
输出与图示
代码运行后会输出拟合直线的参数,并显示数据点和拟合直线的图像。
你可以通过调整数据点或者更改噪声的大小来观察最小二乘法拟合结果的变化。