问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

最小二乘法详解:从线性到非线性拟合

创作时间:
作者:
@小白创作中心

最小二乘法详解:从线性到非线性拟合

引用
CSDN
1.
https://m.blog.csdn.net/IT_ORACLE/article/details/145161876

最小二乘法是一种广泛使用的数据拟合方法,用于在统计学和数学中找到最佳拟合曲线或模型,使得观测数据点与模型预测值之间的误差平方和最小化。本文将详细介绍最小二乘法的基本概念、线性最小二乘法的数学推导和代码实现,以及非线性最小二乘法的扩展应用。

基本概念

假设有一组观测数据点 ((x_i, y_i)),希望找到一个模型 (y = f(x)),使得模型预测值 (f(x_i)) 与实际观测值 (y_i) 的误差最小。定义误差为:

[e_i = y_i - f(x_i)]

最小二乘法的目标是最小化误差平方和:

[S = \sum_{i=1}^{n} e_i^2 = \sum_{i=1}^{n} (y_i - f(x_i))^2]

线性最小二乘法

最常见的情况是线性模型,即 (f(x) = ax + b)。通过最小化平方误差,计算出最佳拟合的参数 (a) 和 (b)。

目标函数

[S = \sum_{i=1}^{n} (y_i - (ax_i + b))^2]

求解公式

通过对 (S) 分别对 (a) 和 (b) 求偏导并令其为 0,得到方程组:

[\frac{\partial S}{\partial a} = -2 \sum_{i=1}^{n} x_i (y_i - (ax_i + b)) = 0]
[\frac{\partial S}{\partial b} = -2 \sum_{i=1}^{n} (y_i - (ax_i + b)) = 0]

解得:

[a = \frac{n \sum x_i y_i - \sum x_i \sum y_i}{n \sum x_i^2 - (\sum 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}]

其中,(\bar{x}) 和 (\bar{y}) 分别是 (x) 和 (y) 的平均值。

代码实现

import numpy as np
import matplotlib.pyplot as plt

# 示例数据
x = np.array([1, 2, 3, 4, 5])  # 自变量
y = np.array([2.2, 2.8, 3.6, 4.5, 5.1])  # 因变量

# 计算最小二乘法参数
n = len(x)
x_mean = np.mean(x)
y_mean = np.mean(y)

# 根据公式计算斜率和截距
b = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean) ** 2)
a = y_mean - b * x_mean

print(f"拟合直线方程:y = {a:.2f} + {b:.2f}x")

# 使用拟合直线进行预测
y_pred = a + b * x

# 绘制散点图和拟合直线
plt.scatter(x, y, color="blue", label="实际数据点")
plt.plot(x, y_pred, color="red", label="拟合直线")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.title("最小二乘法线性回归")
plt.show()

运行结果

  1. 输出拟合直线方程:
拟合直线方程:y = 1.39 + 0.75x
  1. 绘制图形:
  • 蓝色散点表示原始数据。
  • 红色直线表示最小二乘法拟合的直线。

扩展:非线性最小二乘法

如果模型 (f(x)) 是非线性的(如指数、对数、幂函数等),需要使用数值优化方法(如梯度下降、牛顿法)求解最优参数。常用软件工具(如 MATLAB、Python 的 SciPy 库)提供了实现非线性最小二乘法的函数。

使用 SciPy 实现非线性最小二乘法

如果你的模型是非线性的(例如 (y = ae^{bx})),可以使用 SciPy 的 curve_fit 方法:

代码实现

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 示例数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2.7, 7.4, 20.1, 54.6, 148.4])  # 模拟非线性数据

# 定义非线性模型,例如 y = a * e^(b * x)
def model(x, a, b):
    return a * np.exp(b * x)

# 拟合模型
params, _ = curve_fit(model, x, y)
a, b = params

print(f"拟合非线性方程:y = {a:.2f} * exp({b:.2f} * x)")

# 使用模型预测
y_pred = model(x, a, b)

# 绘制结果
plt.scatter(x, y, color="blue", label="实际数据点")
plt.plot(x, y_pred, color="green", label="拟合曲线")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.title("非线性最小二乘法拟合")
plt.show()

运行结果

  1. 输出拟合非线性方程:
拟合非线性方程:y = 1.00 * exp(1.00 * x)
  1. 绘制图形:
  • 蓝色散点表示实际数据点。
  • 绿色曲线表示非线性模型的拟合结果。

应用领域

  1. 回归分析:在统计学中用于构建线性或非线性回归模型。
  2. 曲线拟合:在实验数据中寻找最佳拟合曲线。
  3. 信号处理:用于去噪和数据预测。
  4. 机器学习:作为线性模型训练的一部分,例如线性回归。

优点与局限性

优点

  • 方法简单且计算效率高。
  • 适用于多种模型,尤其是线性模型。

局限性

  • 对离群点敏感:极端值可能显著影响拟合效果。
  • 仅适用于误差为高斯分布的情形:当误差不服从正态分布时,结果可能不可靠。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号