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

机器学习-使用梯度下降最小化均方误差

前面有一篇文章《机器学习-常用的三种梯度下降法》,这篇文章中对于均方误差的求偏导是错误的,为了澄清这个问题,我再写一篇文章来纠正一下,避免误导大家。

一、批量梯度下降法

我们用 批量梯度下降法 来求解一个简单的 线性回归模型,找出最优参数。

假设问题:

假设我们有以下训练数据集(假设是某个小型房屋面积与价格的关系):

房屋面积 (平方英尺) x房屋价格 (万元) y
13
25
37
49

我们假设线性模型的形式为:

y=wx+b

我们的目标是找到参数 w(权重) 和 b(偏置),使得预测值 y^最接近真实值 y。

步骤 1:定义损失函数(均方误差 MSE)

批量梯度下降法的目标是最小化损失函数,常见的损失函数是 均方误差(MSE):

其中:

  • mm 是样本数量(本例中 m=4)
  • x_i 是输入特征
  • y_i 是实际输出
  • w 是模型权重,b 是偏置

步骤 2:计算损失函数的梯度

对损失函数 J(w,b)进行求导,得到偏导数(梯度):

步骤 3:更新参数公式

使用批量梯度下降法,按照以下公式更新参数:

其中:

  • α 是学习率(如 0.01 或 0.1),控制每次更新的步长
  • 梯度值表示损失函数对参数 w 和 b 的变化率

步骤 4:具体计算示例(手算)

假设初始参数:

  • w=0, b=0
  • 学习率 α=0.01
第 1 轮迭代:

计算预测值:

计算误差(预测 - 真实):

计算梯度:

更新参数:

第 2 轮迭代:

使用更新后的参数 w=0.35, b=0.12,重复上述步骤,直到参数收敛。

步骤 5:Python 代码示例

下面是使用 Python 实现批量梯度下降的简单代码:

import numpy as np

# 输入数据
X = np.array([1, 2, 3, 4])  # 房屋面积
y = np.array([3, 5, 7, 9])  # 房屋价格

# 初始化参数
w = 0
b = 0
learning_rate = 0.01
num_iterations = 1000  # 迭代次数

# 梯度下降
m = len(X)  # 样本数量
for i in range(num_iterations):
    y_pred = w * X + b  # 预测值
    error = y_pred - y  # 误差

    # 计算梯度
    dw = (2/m) * np.sum(error * X)
    db = (2/m) * np.sum(error)

    # 更新参数
    w -= learning_rate * dw
    b -= learning_rate * db

    if i % 100 == 0:
        loss = np.mean(error ** 2)
        print(f"Iteration {i}: Loss = {loss}, w = {w}, b = {b}")

# 结果输出
print(f"Trained parameters: w = {w}, b = {b}")

步骤 6:应用场景

批量梯度下降适合以下情况:

  1. 数据量较小(可以快速计算整个数据集的梯度)
  2. 数据噪声较少(因为每次更新都使用完整数据,减少波动)
  3. 适用于批量处理场景,如:
    • 线性回归(如房价预测、销售预测)
    • 机器学习训练时的批处理系统

总结

  • 批量梯度下降法的特点:

    1. 每次使用 全部数据 来计算损失和梯度。
    2. 收敛速度稳定,但计算量较大,适合小数据集。
    3. 更新参数时是全局最优的方向,但容易卡在局部最优。
  • 示例回顾:
    我们通过房屋面积与价格的线性回归模型,演示了如何使用批量梯度下降一步步优化参数 w 和 b,最终使得预测值与真实值尽可能接近。

希望这个例子能帮助你理解批量梯度下降法的实际应用!

二、随机梯度下降法

用随机梯度下降法(SGD)求解线性回归模型的参数:

假设问题:

我们要拟合一个简单的线性回归模型:

y=wx+b

给定一些样本数据:

xy
13
25
37
49

目标是找到参数 w 和 b,使得均方误差(MSE)最小:

随机梯度下降法的步骤:

实际计算示例:

重复迭代过程:

接下来从数据集中随机抽取样本,比如 (x2=2,y2=5),并重复计算梯度和更新参数,直到收敛(参数变化足够小)。

总结:
  1. 批量梯度下降 一次使用所有数据计算梯度,而
  2. 随机梯度下降(SGD) 每次仅使用一个随机样本来更新参数,因此更新速度快,但震荡较大。
  3. 适用于大规模数据,能够更快接近最优解。

希望这个示例对你有所帮助!

三、再来回顾一下大一高数中导数的求法

求导步骤:

使用 链式法则 进行求导:

最终结果:

机器学习中,梯度和导数是很重要的概念,大家可以回顾一下高等数学中的微分,对于我们学习机器学习有很大的帮助。


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

相关文章:

  • 乒乓球日常烧拍日记之四海绵支撑
  • 专为课堂打造:宏碁推出三款全新耐用型 Chromebook
  • 使用云服务器自建Zotero同步的WebDAV服务教程
  • 二叉搜索树中的搜索(力扣700)
  • ansible自动化运维实战--script、unarchive和shell模块(6)
  • ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
  • 数据库的JOIN连接查询算法
  • BUUCTF_Web( XSS COURSE 1)xss
  • golang 编程规范 - Effective Go 中文
  • 【C】memory 详解
  • 了解网络编程
  • 【面试】如何自我介绍?
  • 基于Docker的Spark分布式集群
  • 深度学习-97-大语言模型LLM之基于langchain的实体记忆和知识图谱记忆
  • 2024年AI多极竞争:技术创新与商业突破
  • 深入理解 JavaScript 对象字面量:创建对象的简洁方法
  • 如何使用 pytest-html 创建自定义 HTML 测试报告
  • 百度“秒哒”能开始内测了?李彦宏:假!
  • [JavaScript] 面向对象编程
  • mysql之group by语句
  • [RoarCTF 2019]Easy Calc1
  • 【例51.3】 平移数据
  • 头歌实训作业 算法设计与分析-动态规划(第1关:0/1背包问题)
  • 【Python】第四弹---深入理解Python控制流:从顺序到循环的全面解析
  • 论文速读|Beit: Bert pre training of image transformers.ICLR22
  • BGP分解实验·12——配置路由反射器