当前位置: 首页 > article >正文

【机器学习】数据拟合-最小二乘法(Least Squares Method)

最小二乘法(Least Squares Method)

最小二乘法是一种广泛使用的数据拟合方法,用于在统计学和数学中找到最佳拟合曲线或模型,使得观测数据点与模型预测值之间的误差平方和最小化。以下是详细介绍:


基本概念

  • 假设有一组观测数据点 (x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n),希望找到一个模型 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 \left(y_i - f(x_i)\right)^2

线性最小二乘法

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

  1. 目标函数

    S = \sum_{i=1}^n \left(y_i - (a + bx_i)\right)^2
  2. 求解公式: 通过对 S 分别对 a 和 b 求偏导并令其为 0,得到方程组:

    \frac{\partial S}{\partial a} = 0, \quad \frac{\partial S}{\partial b} = 0
     

    解得:

    b = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^n (x_i - \bar{x})^2}, \quad a = \bar{y} - b\bar{x}
     

    其中,\bar{x}\bar{y}​ 分别是 x_iy_i​ 的平均值。

  3. 代码实现:

    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

  2. 绘制图形:

    • 蓝色散点表示原始数据。
    • 红色直线表示最小二乘法拟合的直线。 

扩展:非线性最小二乘法

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

如果你的模型是非线性的(例如 y=aebxy = a e^{bx}y=aebx),可以使用 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.2, 2.8, 3.6, 4.5, 5.1])  # 因变量

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

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

# 拟合模型
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)

  2. 绘制图形:

    • 蓝色散点表示实际数据点。
    • 绿色曲线表示非线性模型的拟合结果。

应用领域

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

优点与局限性

优点
  • 方法简单且计算效率高。
  • 适用于多种模型,尤其是线性模型。
局限性
  • 对离群点敏感:极端值可能显著影响拟合效果。
  • 仅适用于误差为高斯分布的情形:当误差不服从正态分布时,结果可能不可靠。

http://www.kler.cn/a/505831.html

相关文章:

  • electron 如何申请 Mac 系统权限
  • <OS 有关>Ubuntu 24 安装 openssh-server, tailscale+ssh 慢增加
  • 计算机的错误计算(二百一十二)
  • 【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)
  • 《机器学习》——贝叶斯算法
  • 优先级队列(算法十四)
  • 苹果手机ios脚本用按键精灵文件配置代码
  • SpringBoot:使用HTTP2+protobuf实现高性能微服务调用(一)服务器端实现
  • Checkbox 多选框的使用
  • 微信小程序原生与 H5 交互方式
  • Django Admin 自定义操作封装
  • ssh,samba,tftp,nfs服务安装和配置
  • 【Java计算机毕业设计】基于SSM旅游景区网络购票系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】
  • 19. 删除链表的倒数第 N 个结点【力扣】
  • 从零开始深度学习:(1)张量的常用操作
  • 从0开始学习搭网站第三天
  • 【k8s】用户和服务账户联系(user、serviceaccount、sa)
  • C++ inline的使用和含义详解
  • JavaScript系列(28)--模块化开发详解
  • ansible之playbook实战
  • OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)
  • 文章复现—面向配电网韧性提升的移动储能预布局与动态调度策略
  • Excel批量写sql
  • RPC实现原理,怎么跟调用本地一样
  • vue3使用vue-native-websocket-vue3通讯
  • 省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据