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

深入浅出机器学习中的梯度下降算法

大家好,在机器学习中,梯度下降算法(Gradient Descent)是一个重要的概念。它是一种优化算法,用于最小化目标函数,通常是损失函数。梯度下降可以帮助找到一个模型最优的参数,使得模型的预测更加准确,本文将介绍梯度下降算法的原理、公式以及在Python中实现这一算法。

1. 梯度下降算法的理论基础

在数学中,梯度是一个向量,表示函数在某一点的变化率和方向。在多维空间中,梯度指向函数上升最快的方向。

图片

可以通过梯度来找到函数的最小值或最大值,对于损失函数关注的是最小值。

梯度下降的核心思想是通过不断调整参数,沿着损失函数的梯度方向移动,从而逐步逼近最小值。具体步骤如下:

(1) 初始化参数:随机选择参数的初始值。

(2) 计算梯度:计算损失函数对每个参数的梯度。

(3) 更新参数:根据梯度信息调整参数,更新规则为:

其中:\theta是要优化的参数;\alpha是学习率(step size),决定每次更新的幅度;\triangledown J(\theta )是损失函数关于参数的梯度。

(4) 重复步骤:重复计算梯度和更新参数,直到收敛(即损失函数的变化非常小)。

假设我们有一个简单的线性回归问题,目标是最小化均方误差(MSE)损失函数: 

其中\hat{Y}_{i} = \theta _{0} + \theta _{1}X_{i}是模型的预测值。为了使用梯度下降,我们需要计算损失函数关于参数的梯度: 

通过求导,可以得到梯度表达式,并利用它来更新参数。

2. Python 实现梯度下降算法

接下来将通过一个简单的线性回归示例来实现梯度下降算法,以下是实现代码:

import numpy as np
import matplotlib.pyplot as plt

生成一些随机数据来模拟房屋面积与房价之间的线性关系:

# 生成数据
np.random.seed(0)

# 生成自变量 X(房屋面积),范围从50到200平方米
X = 50 + 150 * np.random.rand(100)  # 生成从50到200的100个点

# 生成因变量 Y(房价),假设房价与房屋面积的关系
Y = 300000 + 2000 * X + np.random.randn(100) * 20000  # 线性关系加上噪声,价格范围在30万到50万之间

# 绘制生成的散点图
plt.scatter(X, Y, color='blue', alpha=0.5)
plt.title('房屋面积与房价的关系')
plt.xlabel('房屋面积 (平方米)')
plt.ylabel('房价 (人民币)')
plt.grid()
plt.show()

图片

实现梯度下降算法的核心部分:

# 将数据标准化,帮助梯度下降更快收敛
X = (X - np.mean(X)) / np.std(X)
Y = (Y - np.mean(Y)) / np.std(Y)

# 梯度下降参数
alpha = 0.01  # 学习率
num_iterations = 1000  # 迭代次数
m = len(Y)  # 样本数量

# 初始化参数
theta_0 = 0  # 截距
theta_1 = 0  # 斜率

# 存储损失值
losses = []

# 梯度下降算法实现
for i in range(num_iterations):
    # 计算预测值
    Y_pred = theta_0 + theta_1 * X
    
    # 计算损失函数 (MSE)
    loss = (1/m) * np.sum((Y - Y_pred) ** 2)
    losses.append(loss)
    
    # 计算梯度
    gradient_0 = -(2/m) * np.sum(Y - Y_pred)  # 截距的梯度
    gradient_1 = -(2/m) * np.sum((Y - Y_pred) * X)  # 斜率的梯度
    
    # 更新参数
    theta_0 -= alpha * gradient_0
    theta_1 -= alpha * gradient_1

print(f'截距 (θ0): {theta_0:.4f}, 斜率 (θ1): {theta_1:.4f}')

截距 (θ0): 0.0000, 斜率 (θ1): 0.9743

通过绘制损失函数随迭代次数变化的曲线,观察梯度下降的收敛过程。

# 绘制损失函数变化曲线
plt.figure()
plt.plot(range(num_iterations), losses, color='blue')
plt.title('损失函数随迭代次数的变化')
plt.xlabel('迭代次数')
plt.ylabel('损失值 (MSE)')
plt.grid()
plt.show()

最后,我们可以将训练好的回归线可视化,以观察模型的效果。​​​​​​​​​​​​​​

# 可视化回归线
plt.figure()
plt.scatter(X, Y, color='blue', alpha=0.5)
plt.plot(X, theta_0 + theta_1 * X, color='red', linewidth=2)
plt.title('梯度下降后的线性回归拟合')
plt.xlabel('房屋面积 (标准化)')
plt.ylabel('房价 (标准化)')
plt.grid()

plt.tight_layout()  # 调整子图间距
plt.show()

图片

梯度下降算法在许多机器学习算法中得到了广泛应用,比如线性回归、逻辑回归、神经网络等,可以用于分类问题,通过优化对数损失函数,也可以用于深度学习,反向传播算法依赖于梯度下降来更新权重。


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

相关文章:

  • 相交的链表
  • 003-SpringBoot整合Pagehelper
  • 106.【C语言】数据结构之二叉树的三种递归遍历方式
  • 13TB的StarRocks大数据库迁移过程
  • GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集
  • 【element-tiptap】添加公式编辑器【MathQuill】
  • 【深度学习】检索增强生成 RAG
  • JAVA中的@Builder是什么意思
  • Day29 贪心算法 part03
  • # 02_Python基础到实战一飞冲天(三)-python面向对象(二)--初始化方法和内置方法
  • MyBatis-Plus介绍及基本使用
  • 如何在鸿蒙API9和x86模拟器中使用MQTT
  • 昇腾CANN 8.0基于LLM P-D分离部署方案发布LLM-DataDist组件:高效低成本,简单易集成
  • 前端 如何用 div 标签实现 步骤审批
  • leetcode102:二叉树的层序遍历
  • 【力扣热题100】—— Day3.反转链表
  • xiaolin coding 图解 MySQL笔记——索引篇
  • Unity Ads常见问题:投放、变现、安装等注意事项
  • AI智护视听生活,飞利浦PUF8160震撼上市!
  • go的web框架介绍
  • Kafka2.2.0集群安装
  • Vue.js 与 TypeScript(3):tsconfig.json详细配置
  • 期末复习-Hadoop名词解释+简答题纯享版
  • 基于神经网络的弹弹堂类游戏弹道快速预测
  • 【机器学习】数据操作与数据预处理
  • 新手参加2025年CTF大赛——Web题目的基本解题流程