【机器学习知识点】【1】二维与三维空间梯度下降微分求解及可视化展示

news2024/11/29 4:30:00

【机器学习知识点】系列文章主要介绍机器学习的相关技巧及知识点,欢迎点赞,关注共同学习交流。

本文主要介绍了机器学习中梯度下降的数学微分求解方法及其可视化。

目录

  • 1. 二维空间的梯度下降求解及可视化
    • 1.1 二维空间梯度求解
    • 1.2二维空间梯度可视化
  • 2. 三维空间的梯度求解及可视化
    • 2.1 三维空间梯度下降求解---示例1
    • 2.2 三维空间梯度可视化--示例1
    • 2.3 三维空间梯度下降求解---示例2
    • 2.4 三维空间梯度可视化--示例2

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import math
from mpl_toolkits.mplot3d import Axes3D
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

1. 二维空间的梯度下降求解及可视化

1.1 二维空间梯度求解

# 定义示例函数
def f1(x):
    return 0.5 * (x - 0.25) ** 2
# 导函数
def h1(x):
    return 0.5 * 2 * (x - 0.25)

# 使用梯度下降法求解
GD_X = []
GD_Y = []
x = 4
alpha = 0.5
f_change = f1(x)   # 变化量
f_current = f_change
GD_X.append(x)
GD_Y.append(f_current)
iter_num = 0
while f_change > 1e-10 and iter_num < 100:
    iter_num += 1
    x = x - alpha * h1(x)
    tmp = f1(x)
    f_change = np.abs(f_current - tmp)
    f_current  = tmp
    GD_X.append(x)
    GD_Y.append(f_current)
print(u"最终结果为:(%.5f, %.5f)" % (x, f_current))
print(u"迭代过程中X的取值,迭代次数:%d" % iter_num)
print(GD_X)
最终结果为:(0.25001, 0.00000)
迭代过程中X的取值,迭代次数:19
[4, 2.125, 1.1875, 0.71875, 0.484375, 0.3671875, 0.30859375, 0.279296875, 0.2646484375, 0.25732421875, 0.253662109375, 0.2518310546875, 0.25091552734375, 0.250457763671875, 0.2502288818359375, 0.25011444091796875, 0.2500572204589844, 0.2500286102294922, 0.2500143051147461, 0.25000715255737305]

1.2二维空间梯度可视化

# 构建数据
X = np.arange(-4, 4.5, 0.05)
Y = np.array(list(map(lambda t: f1(t), X)))

# 画图
plt.figure(facecolor='w')
plt.plot(X, Y, 'r-', linewidth=2)
plt.plot(GD_X, GD_Y, 'bo--', linewidth=2)
plt.title(u'函数$y=0.5 * (θ - 0.25)^2$; \n学习率:%.3f; 最终解:(%.3f, %.3f);迭代次数:%d' % (alpha, x, f_current, iter_num))
plt.show()

请添加图片描述

2. 三维空间的梯度求解及可视化

2.1 三维空间梯度下降求解—示例1

# 三维原始图像
def f2(x, y):
    return 0.6 * (x + y) ** 2 - x * y
# 导函数
def hx2(x, y):
    return 0.6 * 2 * (x + y) - y
def hy2(x, y):
    return 0.6 * 2 * (x + y) - x

# 使用梯度下降法求解
GD_X1 = []
GD_X2 = []
GD_Y = []
x1 = 4
x2 = 4
alpha = 0.5
f_change = f2(x1, x2)
f_current = f_change
GD_X1.append(x1)
GD_X2.append(x2)
GD_Y.append(f_current)
iter_num = 0
while f_change > 1e-10 and iter_num < 100:
    iter_num += 1
    prex1 = x1
    prex2 = x2
    x1 = x1 - alpha * hx2(prex1, prex2)
    x2 = x2 - alpha * hy2(prex1, prex2)
    
    tmp = f2(x1, x2)
    f_change = np.abs(f_current - tmp)
    f_current  = tmp
    GD_X1.append(x1)
    GD_X2.append(x2)
    GD_Y.append(f_current)
print(u"最终结果为:(%.5f, %.5f, %.5f)" % (x1, x2, f_current))
print(u"迭代过程中X的取值,迭代次数:%d" % iter_num)
print(GD_X1)
最终结果为:(0.00000, 0.00000, 0.00000)
迭代过程中X的取值,迭代次数:12
[4, 1.2000000000000002, 0.3600000000000001, 0.10800000000000004, 0.03240000000000001, 0.009720000000000006, 0.002916000000000002, 0.0008748000000000007, 0.0002624400000000003, 7.873200000000009e-05, 2.3619600000000034e-05, 7.0858800000000115e-06, 2.125764000000004e-06]

2.2 三维空间梯度可视化–示例1

# 构建数据
X1 = np.arange(-4, 4.5, 0.2)
X2 = np.arange(-4, 4.5, 0.2)
X1, X2 = np.meshgrid(X1, X2)
Y = np.array(list(map(lambda t: f2(t[0], t[1]), zip(X1.flatten(), X2.flatten()))))
Y.shape = X1.shape

# 画图
fig = plt.figure(facecolor='w')
ax = Axes3D(fig)
ax.plot_surface(X1, X2, Y, rstride=1, cstride=1, cmap=plt.cm.jet)
ax.plot(GD_X1, GD_X2, GD_Y, 'bo--')

ax.set_title(u'函数$y=0.6 * (θ1 + θ2)^2 - θ1 * θ2$;\n学习率:%.3f; 最终解:(%.3f, %.3f, %.3f);迭代次数:%d' % (alpha, x1, x2, f_current, iter_num))
plt.show()

请添加图片描述

2.3 三维空间梯度下降求解—示例2

# 三维原始图像
def f2(x, y):
    return 0.15 * (x + 0.5) ** 2 + 0.25 * (y  - 0.25) ** 2 + 0.35 * (1.5 * x - 0.2 * y + 0.35 ) ** 2  
## 偏函数
def hx2(x, y):
    return 0.15 * 2 * (x + 0.5) + 0.25 * 2 * (1.5 * x - 0.2 * y + 0.35 ) * 1.5
def hy2(x, y):
    return 0.25 * 2 * (y  - 0.25) - 0.25 * 2 * (1.5 * x - 0.2 * y + 0.35 ) * 0.2

# 使用梯度下降法求解
GD_X1 = []
GD_X2 = []
GD_Y = []
x1 = 4
x2 = 4
alpha = 0.5
f_change = f2(x1, x2)
f_current = f_change
GD_X1.append(x1)
GD_X2.append(x2)
GD_Y.append(f_current)
iter_num = 0
while f_change > 1e-10 and iter_num < 100:
    iter_num += 1
    prex1 = x1
    prex2 = x2
    x1 = x1 - alpha * hx2(prex1, prex2)
    x2 = x2 - alpha * hy2(prex1, prex2)
    
    tmp = f2(x1, x2)
    f_change = np.abs(f_current - tmp)
    f_current  = tmp
    GD_X1.append(x1)
    GD_X2.append(x2)
    GD_Y.append(f_current)
print(u"最终结果为:(%.5f, %.5f, %.5f)" % (x1, x2, f_current))
print(u"迭代过程中X的取值,迭代次数:%d" % iter_num)
print(GD_X1)
最终结果为:(-0.26514, 0.23121, 0.01145)
迭代过程中X的取值,迭代次数:58
[4, 1.2437500000000004, 0.4018281250000001, 0.10764167968750005, -0.020251824511718725, -0.09072903259106443, -0.13665442183532897, -0.1692451675603763, -0.19321986254564413, -0.2111035034347064, -0.22451318574939427, -0.23458748520858907, -0.24216134745348197, -0.2478568516346237, -0.2521402459632734, -0.25536175233244196, -0.25778465207644113, -0.2596069270566862, -0.2609774714894122, -0.2620082671887549, -0.26278353575420116, -0.26336662064597083, -0.2638051628706461, -0.2641349935482922, -0.26438306151128765, -0.26456963516415805, -0.26470995851564694, -0.264815496691451, -0.2648948726929125, -0.2649545719397508, -0.26499947216157443, -0.2650332419329969, -0.2650586404146882, -0.2650777427907201, -0.2650921098215726, -0.26510291536613795, -0.2651110422919135, -0.26511715460972984, -0.2651217517267848, -0.2651252092507311, -0.26512780967871585, -0.2651297654788229, -0.2651312364497865, -0.2651323427773544, -0.2651331748540696, -0.265133800664797, -0.26513427134142975, -0.265134625340623, -0.2651348915858965, -0.26513509183083206, -0.26513524243645115, -0.26513535570799246, -0.2651354409003123, -0.26513550497405297, -0.2651355531643622, -0.26513558940863147, -0.2651356166682003, -0.265135637170313, -0.26513565259009564]

2.4 三维空间梯度可视化–示例2

# 构建数据
X1 = np.arange(-4, 4.5, 0.2)
X2 = np.arange(-4, 4.5, 0.2)
X1, X2 = np.meshgrid(X1, X2)
Y = np.array(list(map(lambda t: f2(t[0], t[1]), zip(X1.flatten(), X2.flatten()))))
Y.shape = X1.shape


# 画图
fig = plt.figure(facecolor='w')
ax = Axes3D(fig)
ax.plot_surface(X1, X2, Y, rstride=1, cstride=1, cmap=plt.cm.jet)
ax.plot(GD_X1, GD_X2, GD_Y, 'ko--')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

ax.set_title(u'函数;\n学习率:%.3f; 最终解:(%.3f, %.3f, %.3f);迭代次数:%d' % (alpha, x1, x2, f_current, iter_num))
plt.show()

请添加图片描述
如果内容对你有帮助,感谢点赞+关注哦!

更多干货内容持续更新中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

灰色关联度分析-详细代码和说明

1、数据来源&#xff1a;自主计算 2、时间跨度&#xff1a;无 3、区域范围&#xff1a;无 4、指标说明&#xff1a; 因素分析的基本方法过去采用的主要是统计的方法&#xff0c;如回归分析&#xff0c;回归分析虽然是一种较通用的方法&#xff0c;但大都只用于少因素的、线…

SpringBoot SpringBoot 原理篇 3 核心原理 3.2 启动流程【1】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇3 核心原理3.2 启动流程【1】3.2.1 环境准备3.2.2 启动流程3 核心原理 3.2 启…

基本的图像处理操作

Python中的图像处理基础图像处理是一种对图像执行操作以从中提取信息或增强图像的方法。图像处理是当今计算机视觉中最热门的话题之一&#xff0c;因为它被认为是计算机视觉、OCR 和其他相机相关领域的基础。让我们开始实际处理图像。提示&#xff1a;只是在这里向你展示一个代…

MySQL数据库的事务

文章目录一、事务是什么&#xff1f;二、事务的四大特征原子性一致性持久性隔离性MySQL的四个隔离级别一、事务是什么&#xff1f; 数据库的事务是一种机制&#xff0c;一个操作序列&#xff0c;里面包含了一组数组库操作命令 事务把所有的命令作为一个整体一起向系统提交或撤…

世界杯直播背后的服务器(云计算体系)

世界杯直播背后的服务器 世界杯直播过程中&#xff0c;各大网络平台流媒体app上最大的变化毫无疑问就是零延迟。以前球迷看球是都会发现&#xff0c;网络直播的球赛会比电视播出的球赛延迟40s左右。如果群里有个看电视的兄弟兄弟每个进球他都能提前40秒预告给你&#xff0c;那么…

MySQL 索引

目录 一、索引的概念 二、索引的作用 三、索引的缺点 四、创建索引的原则依据 五、索引的分类和创建 1、普通索引 2、唯一索引 3、主键索引 4、组合索引&#xff08;单列索引与多列索引&#xff09; 5、全文索引&#xff08;FULLTEXT&#xff09; 六、查看索引 七、…

SpringBoot SpringBoot 原理篇 1 自动配置 1.18 自动配置原理

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.18 自动配置原理1.18.1 变更自动配置1.18.2 小结1.18.3 总结1 自…

校园网站毕业设计,校园网站设计与实现,校园网站论文作品参考

功能清单 【后台管理员功能】 关于我们设置&#xff1a;设置学校简介、联系我们、加入我们、法律声明、学校详情 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信…

飞桨模型部署至docker并使用FastAPI调用(五)-WordPress展示页面

文章首发及后续更新&#xff1a;https://mwhls.top/4092.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 飞桨模型部署至docker并使用FastAPI调用目录框架搭建 测试…

关于图的学习

一、图的定义 图G由顶点集V和边集E组成&#xff0c;记为G &#xff08;V, E&#xff09;&#xff0c;其中V(G)表示图G中顶点的有限非空集&#xff1b;E(G)表示图G中顶点之间的关系&#xff08;边&#xff09;集合。若V { v1,v2,...,vn }&#xff0c;则用 | V | 表示图G中顶点…

PyQt5可视化编程-布局管理

在一个GUI程序里&#xff0c;布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定&#xff1a;绝对定位和PyQt5的layout类 1.绝对定位: 每个程序都是以像素为单位区分元素的位置&#xff0c;衡量元素的大小。所以我们完全可以使用绝对定位搞定每个…

【Linux】网络编程基础

文章目录网络基础1.网络与操作系统的关系2.计算机网络发展3.协议3.1协议分层3.2OS七层模型3.3TCP/IP五层模型4.网络传输基本流程4.1数据包的封装和分用4.1.1报头和有效载荷4.2局域网的两台主机通信4.3跨网络的两台主机通信5.IP地址和MAC地址5.1IP地址5.2MAC地址5.3IP地址和MAC地…

XSCTF联合招新【真是阳间题】(MSIC+Crypto)

文章目录XSCTF联合招新【真是阳间题】&#xff08;MSICCrypto&#xff09;Step1&#xff1a;查看文件step2&#xff1a;操作流程关于Base64&#xff0c;Base32&#xff0c;Base16进制的区别方法:Base64&#xff1a;Base32:Base16:XSCTF联合招新【真是阳间题】&#xff08;MSICC…

控制瑞芯微平台GPIO(输入、输出、电平读取)

控制瑞芯微平台GPIO&#xff08;输入、输出&#xff09;GPIO编号计算控制步骤输出高电平读取电平GPIO编号计算 GPIO编号 BANK * 32 GPIO_PIN GPION_MP N * 32 8 * (M -1) P 示例&#xff1a;GPIO7_C2 7 X 32 8 X (3-1) 2 242 GPIO2_A1 2 X 32 8 X (1-1) 1 73 A对…

IO流~File

File File类概述和构造方法 File&#xff1a;它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的对于File而言&#xff0c;其封装的并不是一个真正存在的文件&#xff0c;仅仅是一个路径名而已。它可以是存在的&#xff0c;也可以是不存在的。将来是要通…

【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留言留下QQ~~~ 一、DDPG背景及简介 在动作离散的强化学习任务中&#xff0c;通常可以遍历所有的动作来计算动作值函数q(s,a)q(s,a)&#xff0c;从而得到最优动作值函数q∗(s,a)q∗(s,a) 。但在大规模连续动作空间中&#xff0c;遍历所有动作是不…

Css3 2D转换 2D转换之移动tranlate

转换&#xff08;transform&#xff09;是css3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果。 转换你可以简单理解为变形。 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xff1a;scale 2D转换是改变标签在二维平面上的位置和形状的…

Spring - InstantiationAwareBeanPostProcessor 扩展接口

文章目录Preorg.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorInstantiationAwareBeanPostProcessor 注册过程源码分析postProcessBeforeInstantiation的执行时机源码解析使用场景 &#xff1a; 创建代理类Pre Spring Boot - 扩展接口一览 org.s…

AWS Academy LMS 考勤 - 教师

AWS Academy LMS 考勤 &#xff0d; 教师 在 AWS Academy LMS 教材使用 &#xff0d; 教师 说明了如何使用 AWS Academy LMS 中所提供的线上素材&#xff0c;而开始上课后&#xff0c;教师必须要去了解学生对于教材的实际使用状况&#xff0c;在这里介绍如何查看学生在各模块知…

Jsoup爬虫入门实战

一、Jsoup介绍 jsoup 是一款基于 Java 的HTML解析器&#xff0c;它提供了一套非常省力的API&#xff0c;不但能直接解析某个URL地址、HTML文本内容&#xff0c;而且还能通过类似于DOM、CSS或者jQuery的方法来操作数据&#xff0c;所以 jsoup 也可以被当做爬虫工具使用。 相关…