【深度学习】Pytorch基础

embedded/2024/11/13 9:36:29/

目录

  • 梯度下降算法(Gradient Descent)
    • 代码实现

梯度下降算法(Gradient Descent)

梯度下降算法在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。

求下面函数的极值
y = x s i n ( x ) y=xsin(x) y=xsin(x)
可以发现在当前这个区间范围内这个函数有两个极小值点,如果我们想寻找当前函数在这个区间内的最小值点,那么当然是第二个极小值点更合适一些,可是并不一定能够如我们所愿顺利地找到第二个极小值点,这时候只能够通过多次尝试。
在这里插入图片描述

  • 梯度的概念:梯度就是函数对它的各个自变量求偏导后,由偏导数组成的一个向量。
    接着来看下一个函数
    在这里插入图片描述
    既然算法是“梯度下降法”,所以先求一下这个函数的梯度,当前的函数f(x)的梯度就是他的导数,这很简单
    f ( x ) ′ = 2 x − 2 f(x)' = 2x - 2 f(x)=2x2
    图上小红点的坐标是(6,f(6)),那么可以得到 f ( 6 ) ′ = 10 f(6)'=10 f(6)=10
    现在用导数值的正负来表示方向如果导数的值是正数,那么就代表x轴的正方向。如果导数的值是负数就代表x轴的负方向。那么就会发现知道了这个方向之后也就知道了应该让x往哪个方向变化f(x)的值减小。那么就让 朝着导数告诉我们的方向的反方向变化就好啦。
    在这里插入图片描述
  • 梯度下降法的目标:搜索出来一个能让函数值尽可能小的位置,所以让x朝着红色箭头的方向走。
    代码中有一个eta变量,专业称为“学习率”。使用数学表达式来更新x的过程那就是:
    x ← x − e t a ∗ d f ( x ) d x x \leftarrow x -eta*\frac{df(x)}{dx} xxetadxdf(x)
    意思是让x减去eta乘以函数的导数。其中eta是为了控制x更新的幅度,将eta的值设置小一点,那么每一次的更新的幅度就会小一点。

代码实现

import numpy as np
import matplotlib.pyplot as plt
# 定义 x 的范围
x = np.linspace(-7, 9, 400)  # 从 -7 到 9,总共 400 个点
y = (x - 1)**2 + 1  # 函数 y = (x-1)^2 + 1
# 计算 x = 6 时的 y 值
cur_x = 6
cur_y = (cur_x - 1)**2 + 1
eta = 0.05
iter = 1000
all_x = []# 记录迭代过程中的 x 值
all_y = []# 记录迭代过程中的 y 值
for i in range(iter):# 记录迭代过程all_x.append(cur_x)all_y.append(cur_y)# 计算导数dy = 2*cur_x - 2# 更新 x 和 ycur_x = cur_x - eta*dycur_y = (cur_x - 1)**2 + 1
# 绘图
plt.figure(figsize=(10, 6))  # 设置图形大小
plt.plot(x, y, label=r'$y = (x-1)^2 + 1$', color='blue')  # 绘制函数曲线
plt.title('Plot of $y = (x-1)^2 + 1$')  # 图形标题
plt.xlabel('x')  # x 轴标签
plt.ylabel('y')  # y 轴标签
plt.axhline(0, color='black', linewidth=0.5, ls='--')  # 添加 x 轴
plt.axvline(0, color='black', linewidth=0.5, ls='--')  # 添加 y 轴
plt.grid(True)  # 添加网格
plt.legend()  # 添加图例
plt.scatter(np.array(all_x), np.array(all_y), color='red')# 绘制迭代过程
plt.show()  # 显示图形

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/embedded/112478.html

相关文章

PHP环境搭建

PHP环境搭建教程 PHP 是一种流行的后端开发语言,用于构建动态网站和 Web 应用程序。在开发和部署 PHP 项目之前,您需要设置一个适当的 PHP 环境。本教程将帮助您在不同操作系统上快速搭建 PHP 环境。 1. 环境准备 1.1 操作系统 本教程将介绍在以下操作…

如何动态获取路由上的参数

如何动态获取路由上的参数 在许多后端框架中,可以通过路由参数来动态获取URL中的参数。下面是一些常见的后端框架的示例代码: 1. Express.js (Node.js) app.get(/users/:userId, (req, res) > {const userId req.params.userId; // 获取路由参数…

【AcWing】【Go】789. 数的范围

AcWing 789. 数的范围 这是一道二分的模板题,来自于AcWing,使用Go语言重新实现一遍C中二分查找算法的模板,代码如下: package mainimport "fmt"func main() {var n, k intfmt.Scanf("%d %d", &n, &…

小程序开发设计-第一个小程序:创建小程序项目④

上一篇文章导航: 小程序开发设计-第一个小程序:安装开发者工具③-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219152?spm1001.2014.3001.5501 须知:注:不同版本选项有所不同,并无大碍。 一、创…

在Flask中实现日志记录

在Flask中实现日志记录是一个关键的功能,它有助于监控应用的运行情况、调试问题以及记录重要的运行信息。以下是在Flask中实现日志记录的详细步骤和最佳实践: 一、使用Python内置的logging模块 Flask应用通常会使用Python的logging模块来进行日志记录。…

C#迭代器方法和yield用法

一.迭代器方法介绍 可使用foreach循环进行遍历的方法,称为迭代器方法。 迭代器方法使用yield return语句返回元素。 到达yield return语句时,会记住当前在代码中的位置。 下次调用迭代器函数时,将从该位置开始执行。换言之,如果…

Github 2024-09-16 开源项目周报 Top14

根据Github Trendings的统计,本周(2024-09-16统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目2Go项目2JavaScript项目2Shell项目2Rust项目2C++项目2Jupyter Notebook项目1C#项目1React: 用于构建用户界面的JavaS…

高防IP是如何防御攻击

DDoS攻击作为网络攻击中最常见的一种,一般利用大量的虚假流量向目标服务器发起攻击,进而堵塞网络损耗服务器性能,使服务器呈现崩溃状态,令真正的用户无法正常访问发送请求。以前的大型企业通常都是使用高防服务器来抵抗这类攻击&a…