python实现梯度下降算法,并绘制等高线和3d图显示下降过程

这篇具有很好参考价值的文章主要介绍了python实现梯度下降算法,并绘制等高线和3d图显示下降过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言:

        梯度下降算法是一种常用的优化算法,用于最小化目标函数。它在机器学习和深度学习中经常被用来更新模型的参数。在本文中,我们将使用Python实现梯度下降算法,并通过绘制等高线图和3D图表,直观地展示下降过程。

  1. 导入必要的库: 在开始之前,我们需要导入一些Python库。我们使用NumPy进行数值计算,Matplotlib用于绘图。以下是导入库的代码
    import numpy as np
    import matplotlib.pyplot as plt
  2. 定义目标函数: 我们选择一个简单的二维函数来演示梯度下降算法,使用func函数作为我们的目标函数:
    def func(x,y):
        return x**2 + y**2
  3. 计算梯度: 在梯度下降算法中,我们需要计算目标函数关于参数的梯度。对于Rosenbrock函数,我们可以使用以下代码计算梯度(也就是对x,y分别求偏导):
    def grad(x,y):
        return 2*x, 2*y
  4. 实现梯度下降算法: 我们可以使用以下代码实现梯度下降算法:
    # 设置初始点
    x_start,y_start=15,15
    theta=1e-5 # θ =10**-6 设置阈值
    learning_rate=0.2 # 学习率
    # 记录下初始x y值
    x_history=[x_start]
    y_history=[y_start]
    z_history=[func(x_start,y_start)]
    #记录迭代次数
    cnt=0
    
    while True:
        cnt+=1
        # 计算此时梯度
        grad_x,grad_y=grad(x_start,y_start)
        '''计算梯度的范数 即 向量的长度'''
        grad_num=np.sqrt(grad_x**2+grad_y**2)
        # 梯度下降 即x-grad*learn_rate
        x_start-=grad_x*learning_rate
        y_start-=grad_y*learning_rate
        # 将梯度下降过程写入列表
        x_history.append(x_start)
        y_history.append(y_start)
        # 判读梯度范数是否小于阈值
        if grad_num<theta:
            print(f"一共迭代了{cnt}次")
            break
        else:
            continue
  5. 绘制等高线图和3D图表: 最后一步是绘制等高线图和3D图表,以可视化下降过程。这里是相应的代码:
    #生成-20到20的500个点,用于绘制图像
    x=np.linspace(-20,20,500)
    y=np.linspace(-20,20,500)
    # 绘制网格线
    X, Y = np.meshgrid(x, y)
    Z = func(X, Y)
    fig=plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(121, projection='3d')
    ax.scatter(x_history, y_history, func(np.array(x_history), np.array(y_history)),c='red', marker='o', alpha=1)
    ax.plot_surface(X, Y, Z, cmap='viridis',alpha=0.8) # alpha设置透明度
    ax.set_title("3D Plot of f(x, y) = x^2/5 + y^2/3")
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    # 记录迭代的痕迹 scatter
    
    cs=fig.add_subplot(122)
    cs.contour(X,Y,Z)
    cs.set_xlabel('x')
    cs.set_ylabel('y')
    cs.set_title('contour')
    cs.scatter(x_history, y_history, func(np.array(x_history), np.array(y_history)),c='red', marker='.')
    plt.show()
  6. 下面是运行结果:python梯度下降最优可视化,python,算法,开发语言

  7. 完整代码:文章来源地址https://www.toymoban.com/news/detail-854059.html

    # -*- coding: utf-8 -*-
    # @Time : 2023/8/24 20:09
    # @Author :Muzi
    # @File : gradient_1.py
    # @Software: PyCharm
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def func(x, y):
        return x ** 2 + y ** 2
    
    
    def grad(x, y):
        return 2 * x, 2 * y
    
    
    # 设置初始点
    x_start, y_start = 15, 15
    theta = 1e-5  # θ =10**-6 设置阈值
    learning_rate = 0.2  # 学习率
    # 记录下初始x y值
    x_history = [x_start]
    y_history = [y_start]
    z_history = [func(x_start, y_start)]
    # 记录迭代次数
    cnt = 0
    
    while True:
        cnt += 1
        # 计算此时梯度
        grad_x, grad_y = grad(x_start, y_start)
        '''计算梯度的范数 即 向量的长度'''
        grad_num = np.sqrt(grad_x ** 2 + grad_y ** 2)
        # 梯度下降 即x-grad*learn_rate
        x_start -= grad_x * learning_rate
        y_start -= grad_y * learning_rate
        # 将梯度下降过程写入列表
        x_history.append(x_start)
        y_history.append(y_start)
        # 判读梯度范数是否小于阈值
        if grad_num < theta:
            print(f"一共迭代了{cnt}次")
            break
        else:
            continue
    
    x = np.linspace(-20, 20, 500)
    y = np.linspace(-20, 20, 500)
    # 绘制网格线
    X, Y = np.meshgrid(x, y)
    Z = func(X, Y)
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(121, projection='3d')
    ax.scatter(x_history, y_history, func(np.array(x_history), np.array(y_history)), c='red', marker='o', alpha=1)
    ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)  # alpha设置透明度
    ax.set_title("3D Plot of f(x, y) = x^2/5 + y^2/3")
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    # 记录迭代的痕迹 scatter
    
    
    cs = fig.add_subplot(122)
    cs.contour(X, Y, Z)
    cs.set_xlabel('x')
    cs.set_ylabel('y')
    cs.set_title('contour')
    
    cs.scatter(x_history, y_history, func(np.array(x_history), np.array(y_history)), c='red', marker='.')
    
    plt.show()
    

到了这里,关于python实现梯度下降算法,并绘制等高线和3d图显示下降过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity】ShaderGraph实现等高线和高程渐变设色

    ShaderGraph案例下载地址 等高线的实现思路 方法一: 通过Position节点得到顶点的高度(y)值,将高度值除去等高距离取余,设定余数的输出边界(step) 方法二: 将y值减去y值的取整,差值和差值取反相乘,设定输出边界(step) 高程渐变设色的实现思路 简单赋值方法 使用G

    2024年02月14日
    浏览(30)
  • Arcgis画等高线

    今天我们将学习如何在ArcGIS中绘制等高线地图。等高线地图是地理信息系统中常见的数据表现形式,它通过等高线将地形起伏展现得一目了然,不仅美观,还能提供重要的地形信息。 在开始之前,确保已经准备好了高程数据,它通常以栅格数据的形式存在,例如 DEM(数字高

    2024年02月15日
    浏览(26)
  • 如何使用ArcGIS Pro生成等高线

    无论在制图还是规划中,经常会使用到等高线,大多数情况下,从网上获取的高程数据都是DEM文件,我们可以通过ArcGIS Pro来生成等高线,这里为大家介绍一下生成方法,希望能对你有所帮助。 教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据,常见的GIS数据都可

    2024年02月22日
    浏览(32)
  • CGAL 点云数据生成DSM、DTM、等高线和数据分类

      在GIS应用软件中使用的许多传感器(如激光雷达)都会产生密集的点云。这类应用软件通常利用更高级的数据结构:如:不规则三角格网 (TIN)是生成数字高程模型 (DEM) 的基础,也可以利用TIN生成数字地形模型 (DTM)。对点云数据进行分类,提取地面、植被和建筑点(或其他用

    2023年04月08日
    浏览(40)
  • ArcGIS 小白入门——无人机数据处理&山体阴影图&等高线

    操作步骤参照博文: 基于Pix4D使用无人机光学影像制作正射影像(DOM)和数字表面模型(DSM) 操作步骤_pix4d生成正射影像-CSDN博客 文章浏览阅读1.1k次,点赞3次,收藏13次。此教程目的是让读者学会使用PIX4D拼接航片,教程较为通俗,面向初学者和专业人士。_pix4d生成正射影像

    2024年04月09日
    浏览(37)
  • python ERA5 画水汽通量散度图地图:风速风向矢量图、叠加等高线、色彩分级、添加shp文件、添加位置点及备注

    有个同事吧,写论文,让我帮忙出个图,就写了个代码,然后我的博客好久没更新了,就顺便贴上来了! 很多人感兴趣风速的箭头怎样画,可能这种图使用 NCL 非常容易,很多没用过代码的小朋友,就有点犯怵,怕 python 画起来很困难。但是不然,看完我的代码,就会发现很

    2024年04月25日
    浏览(28)
  • ArcGIS Pro创建、发布、调用GP服务全过程示例(等高线分析)

    在之前的文章介绍过使用ArcMap发布GP分析服务,由于ArcGIS后续不在更新ArcMap,改用ArcGIS Pro,本文对ArcGIS Pro发布GP分析服务进行说明。 本文以等高线分析为例,使用ArcGIS Pro软件,从GP分析服务的创建、发布、调用全过程进行演示。 使用ArcMap发布GP服务请跳转:ArcGIS Desktop(Arc

    2024年02月02日
    浏览(33)
  • ArcGIS Desktop(ArcMap)创建、发布、调用GP服务全过程示例(等高线分析)

    本文以等高线分析为例,使用ArcMap软件,从GP分析服务的创建、发布、调用全过程进行演示。 使用ArcGIS Pro发布GP服务请跳转:ArcGIS Pro创建、发布、调用GP服务全过程示例(等高线分析) 本文示例使用软件: ArcGIS Desktop10.3.1 ArcGIS JS API4.16 注:阅读本文前需要对ArcGIS GP服务,模

    2024年02月08日
    浏览(31)
  • 【python手写算法】利用梯度下降实现线性拟合

    利用梯度下降实现线性拟合,效果和sklearn LinearRegression()差不多。 学习率初始设置为0.1结果算高的,直接让我的参数变成了nan。(体会到了飞出去的感觉) 把学习率调小了之后就正常了

    2024年02月15日
    浏览(38)
  • 优化算法之梯度下降|Matlab实现梯度下降算法

    题目要求: 使用Matab实现梯度下降法 对于函数: min ⁡ f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 min f(x)=2 x_{1}^{2}+4 x_{2}^{2}-6 x_{1}-2 x_{1} x_{2} min f ( x ) = 2 x 1 2 ​ + 4 x 2 2 ​ − 6 x 1 ​ − 2 x 1 ​ x 2 ​ 试采用 MATLAB实现最速下降法求解该问题, 给出具体的迭代过程、 最终优化结果、

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包