机器学习强基计划8-5:图解局部线性嵌入LLE算法(附Python实现)

news2024/11/17 1:58:43

目录

  • 0 写在前面
  • 1 流形学习
  • 2 局部线性嵌入算法
    • 2.1 什么是局部线性嵌入?
    • 2.2 算法原理推导
  • 3 Python实现
    • 3.1 算法流程
    • 3.2 核心代码
    • 3.3 可视化

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。

🚀详情:机器学习强基计划(附几十种经典模型源码)


1 流形学习

在机器学习强基计划8-4:流形学习等度量映射Isomap算法(附Python实现)中,我们介绍了流形(manifolds)的概念,它是可以局部欧几里得空间化的一个拓扑空间,是具有拓扑结构的点集,是欧几里得空间中的曲线、曲面等概念的推广。对流形的物理意义不熟悉的同学可以回顾上一篇文章。

在这里插入图片描述

流形学习(manifold learning)是基于流形的机器学习算法,它假设样本数据分布在高维特征空间中的低维嵌入流形上,虽然整体十分复杂,但局部上仍具有欧氏空间的性质,因此可以在局部建立降维映射关系,然后再将局部映射关系推广到全局——局部线性构造全局非线性。流形学习旨在从观测样本中去寻找产生数据分布的内在本质规律,而非破坏结构性地降维。

2 局部线性嵌入算法

2.1 什么是局部线性嵌入?

局部线性嵌入(Locally Linear Embedding, LLE)限制样本在降维后的低维空间中的 k k k近邻局部线性关系,等价于原始空间。

例如,若高维样本满足 x i = w i j x j + w i k x k + w i l x l \boldsymbol{x}_i=w_{ij}\boldsymbol{x}_j+w_{ik}\boldsymbol{x}_k+w_{il}\boldsymbol{x}_l xi=wijxj+wikxk+wilxl,则低维样本同样满足 z i = w i j z j + w i k z k + w i l z l \boldsymbol{z}_i=w_{ij}\boldsymbol{z}_j+w_{ik}\boldsymbol{z}_k+w_{il}\boldsymbol{z}_l zi=wijzj+wikzk+wilzl,如图所示,其中 w i \boldsymbol{w}_i wi称为样本 x i \boldsymbol{x}_i xi重构系数

在这里插入图片描述

2.2 算法原理推导

设高维样本 x i \boldsymbol{x}_i xi k k k近邻样本集合为 Q i k Q_{i}^{k} Qik,则重构系数应满足

min ⁡ w 1 , w 2 , ⋯   , w m ∑ i = 1 m ∥ x i − ∑ j ∈ Q i k w i j x j ∥ 2 2    s . t . ∑ j ∈ Q i k w i j = 1 ( i = 1 , 2 , ⋯   , m ) \underset{\boldsymbol{w}_1,\boldsymbol{w}_2,\cdots ,\boldsymbol{w}_m}{\min}\sum_{i=1}^m{\left\| \boldsymbol{x}_i-\sum_{j\in Q_{i}^{k}}{w_{ij}\boldsymbol{x}_j} \right\| _{2}^{2}}\,\, \mathrm{s}.\mathrm{t}. \sum_{j\in Q_{i}^{k}}{w_{ij}}=1\left( i=1,2,\cdots ,m \right) w1,w2,,wmmini=1m xijQikwijxj 22s.t.jQikwij=1(i=1,2,,m)

为便于优化,将其改写为矩阵形式

min ⁡ w 1 , w 2 , ⋯   , w m ∑ i = 1 m w i T X ~ i T X ~ i w i    s . t . w i T 1 k × 1 = 1 ( i = 1 , 2 , ⋯   , m ) \underset{\boldsymbol{w}_1,\boldsymbol{w}_2,\cdots ,\boldsymbol{w}_m}{\min}\sum_{i=1}^m{\boldsymbol{w}_{i}^{T}\boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i\boldsymbol{w}_i}\,\, \mathrm{s}.\mathrm{t}. \boldsymbol{w}_{i}^{T}\mathbf{1}_{k\times 1}=1\left( i=1,2,\cdots ,m \right) w1,w2,,wmmini=1mwiTX~iTX~iwis.t.wiT1k×1=1(i=1,2,,m)

其中 w i = [ w i 1 w i 2 ⋯ w i k ] T \boldsymbol{w}_i=\left[ \begin{matrix} w_{i1}& w_{i2}& \cdots& w_{ik}\\\end{matrix} \right] ^T wi=[wi1wi2wik]T X ~ i = [ x i − x j 1 x i − x j 2 ⋯ x i − x j k ] , j ∈ Q i k \boldsymbol{\tilde{X}}_i=\left[ \begin{matrix} \boldsymbol{x}_i-\boldsymbol{x}_{j_1}& \boldsymbol{x}_i-\boldsymbol{x}_{j_2}& \cdots& \boldsymbol{x}_i-\boldsymbol{x}_{j_k}\\\end{matrix} \right] , j\in Q_{i}^{k} X~i=[xixj1xixj2xixjk],jQik,应用拉格朗日乘子法可得

L ( w 1 , w 2 , ⋯   , w m , λ ) = ∑ i = 1 m w i T X ~ i T X ~ i w i + λ ( w i T 1 k × 1 − 1 ) L\left( \boldsymbol{w}_1,\boldsymbol{w}_2,\cdots ,\boldsymbol{w}_m,\lambda \right) =\sum_{i=1}^m{\boldsymbol{w}_{i}^{T}\boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i\boldsymbol{w}_i}+\lambda \left( \boldsymbol{w}_{i}^{T}\mathbf{1}_{k\times 1}-1 \right) L(w1,w2,,wm,λ)=i=1mwiTX~iTX~iwi+λ(wiT1k×11)

w i \boldsymbol{w}_i wi求梯度,并令之为0可得

∇ w i L ( w 1 , w 2 , ⋯   , w m , λ ) = w i T X ~ i T X ~ i w i + λ ( w i T 1 k × 1 − 1 ) = 2 X ~ i T X ~ i w i + λ 1 k × 1 = 0 ⇒    w i = − 1 2 λ ( X ~ i T X ~ i ) − 1 1 k × 1 \begin{aligned}\nabla _{\boldsymbol{w}_i}L\left( \boldsymbol{w}_1,\boldsymbol{w}_2,\cdots ,\boldsymbol{w}_m,\lambda \right) &=\boldsymbol{w}_{i}^{T}\boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i\boldsymbol{w}_i+\lambda \left( \boldsymbol{w}_{i}^{T}\mathbf{1}_{k\times 1}-1 \right) \\&=2\boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i\boldsymbol{w}_i+\lambda \mathbf{1}_{k\times 1}\\&=0\\\Rightarrow \,\, \boldsymbol{w}_i&=-\frac{1}{2}\lambda \left( \boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i \right) ^{-1}\mathbf{1}_{k\times 1}\end{aligned} wiL(w1,w2,,wm,λ)wi=wiTX~iTX~iwi+λ(wiT1k×11)=2X~iTX~iwi+λ1k×1=0=21λ(X~iTX~i)11k×1

考虑到 w i T 1 k × 1 = 1 k × 1 T w i = 1 \boldsymbol{w}_{i}^{T}\mathbf{1}_{k\times 1}=\mathbf{1}_{k\times 1}^{T}\boldsymbol{w}_i=1 wiT1k×1=1k×1Twi=1,两边同时左乘 1 k × 1 T \mathbf{1}_{k\times 1}^{T} 1k×1T可得

− 1 2 λ = 1 1 k × 1 T ( X ~ i T X ~ i ) − 1 1 k × 1 -\frac{1}{2}\lambda =\frac{1}{\mathbf{1}_{k\times 1}^{T}\left( \boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i \right) ^{-1}\mathbf{1}_{k\times 1}} 21λ=1k×1T(X~iTX~i)11k×11

联立消去 λ \lambda λ可得

w i = ( X ~ i T X ~ i ) − 1 1 k × 1 1 k × 1 T ( X ~ i T X ~ i ) − 1 1 k × 1 \boldsymbol{w}_i=\frac{\left( \boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i \right) ^{-1}\mathbf{1}_{k\times 1}}{\mathbf{1}_{k\times 1}^{T}\left( \boldsymbol{\tilde{X}}_{i}^{T}\boldsymbol{\tilde{X}}_i \right) ^{-1}\mathbf{1}_{k\times 1}} wi=1k×1T(X~iTX~i)11k×1(X~iTX~i)11k×1

在低维空间中需要维护这组 w i ( i = 1 , 2 , ⋯   , m ) ∈ R k × 1 \boldsymbol{w}_i\left( i=1,2,\cdots ,m \right) \in \mathbb{R} ^{k\times 1} wi(i=1,2,,m)Rk×1,因此优化目标为

min ⁡ z 1 , z 2 , ⋯   , z m ∑ i = 1 m ∥ z i − ∑ j ∈ Q i k w i j z j ∥ 2 2    s . t . ∑ i z i = 0 , 1 m − 1 ∑ i z i z i T = I \underset{\boldsymbol{z}_1,\boldsymbol{z}_2,\cdots ,\boldsymbol{z}_m}{\min}\sum_{i=1}^m{\left\| \boldsymbol{z}_i-\sum_{j\in Q_{i}^{k}}{w_{ij}\boldsymbol{z}_j} \right\| _{2}^{2}}\,\, \mathrm{s}.\mathrm{t}. \sum_i{\boldsymbol{z}_i}=0, \frac{1}{m-1}\sum_i{\boldsymbol{z}_i}\boldsymbol{z}_{i}^{T}=\boldsymbol{I} z1,z2,,zmmini=1m zijQikwijzj 22s.t.izi=0,m11iziziT=I

将重构向量增广为 w ~ i ∈ R m × 1 \boldsymbol{\tilde{w}}_i\in \mathbb{R} ^{m\times 1} w~iRm×1,多余的位置为0;约束条件表示了降维样本的分布模式——样本中心化去除平移自由度、样本单位协方差去除缩放自由度

将优化目标改为矩阵形式

min ⁡ Z ∑ i = 1 m ∥ Z i i − Z w ~ i ∥ 2 2 = min ⁡ Z ∑ i = 1 m ( Z ( i i − w ~ i ) ) T Z ( i i − w ~ i ) = min ⁡ Z    t r ( Z ( I − W ~ ) ( Z ( I − W ~ ) ) T ) = min ⁡ Z    t r ( Z M Z T )    s . t . Z Z T = ( m − 1 ) I \begin{aligned}\underset{\boldsymbol{Z}}{\min}\sum_{i=1}^m{\left\| \boldsymbol{Zi}_i-\boldsymbol{Z\tilde{w}}_i \right\| _{2}^{2}}&=\underset{\boldsymbol{Z}}{\min}\sum_{i=1}^m{\left( \boldsymbol{Z}\left( \boldsymbol{i}_i-\boldsymbol{\tilde{w}}_i \right) \right) ^T\boldsymbol{Z}\left( \boldsymbol{i}_i-\boldsymbol{\tilde{w}}_i \right)}\\&=\underset{\boldsymbol{Z}}{\min}\,\,\mathrm{tr}\left( \boldsymbol{Z}\left( \boldsymbol{I}-\boldsymbol{\tilde{W}} \right) \left( \boldsymbol{Z}\left( \boldsymbol{I}-\boldsymbol{\tilde{W}} \right) \right) ^T \right) \\&=\underset{\boldsymbol{Z}}{\min}\,\,\mathrm{tr}\left( \boldsymbol{ZMZ}^T \right) \,\, \\\mathrm{s}.\mathrm{t}. \boldsymbol{ZZ}^T&=\left( m-1 \right) I\end{aligned} Zmini=1mZiiZw~i22s.t.ZZT=Zmini=1m(Z(iiw~i))TZ(iiw~i)=Zmintr(Z(IW~)(Z(IW~))T)=Zmintr(ZMZT)=(m1)I

采用拉格朗日乘子法

L ( Z , Λ ) = t r ( Z M Z T ) + t r ( Λ T ( Z Z T − ( m − 1 ) I ) ) L\left( \boldsymbol{Z},\boldsymbol{\varLambda } \right) =\mathrm{tr}\left( \boldsymbol{ZMZ}^T \right) +\mathrm{tr}\left( \boldsymbol{\varLambda }^T\left( \boldsymbol{ZZ}^T-\left( m-1 \right) \boldsymbol{I} \right) \right) L(Z,Λ)=tr(ZMZT)+tr(ΛT(ZZT(m1)I))

∂ L ( Z , Λ ) / ∂ Z = 2 Z M + 2 Λ Z = 0 {{\partial L\left( \boldsymbol{Z},\boldsymbol{\varLambda } \right)}/{\partial \boldsymbol{Z}}}=2\boldsymbol{ZM}+2\boldsymbol{\varLambda Z}=0 L(Z,Λ)/Z=2ZM+2ΛZ=0,移项转置可得 M Z T = − Z T Λ \boldsymbol{MZ}^T=-\boldsymbol{Z}^T\boldsymbol{\varLambda } MZT=ZTΛ。设 Y = Z T ∈ R m × d \boldsymbol{Y}=\boldsymbol{Z}^T\in \mathbb{R} ^{m\times d} Y=ZTRm×d,则有 M Y = − Y Λ \boldsymbol{MY}=-\boldsymbol{Y\varLambda } MY=YΛ,这与主成分分析类似,只需对 M \boldsymbol{M} M特征值分解,并取 d ′ ≪ d d'\ll d dd个最小特征值对应的特征向量构成 Y ∗ ∈ R m × d ′ \boldsymbol{Y}^*\in \mathbb{R} ^{m\times d'} YRm×d,转置后即得低维样本 Z ∗ ∈ R d ′ × m \boldsymbol{Z}^*\in \mathbb{R} ^{d'\times m} ZRd×m

必须指出, M \boldsymbol{M} M最小的特征值往往接近0,原因是根据权重和为一 W ~ T 1 = 1 \boldsymbol{\tilde{W}}^T\mathbf{1}=\mathbf{1} W~T1=1可得 ( I − W ~ T ) 1 = ( I − W ~ ) T 1 = 0 \left( \boldsymbol{I}-\boldsymbol{\tilde{W}}^T \right) \mathbf{1}=\left( \boldsymbol{I}-\boldsymbol{\tilde{W}} \right) ^T\mathbf{1}=\mathbf{0} (IW~T)1=(IW~)T1=0,两边同时左乘 ( I − W ~ ) \left( \boldsymbol{I}-\boldsymbol{\tilde{W}} \right) (IW~) M 1 = 0 \boldsymbol{M}\mathbf{1}=\mathbf{0} M1=0,即此时特征向量为全1向量,无法反应数据特征,所以实际应用中会选取第 2   d ′ + 1 2~d'+1 2 d+1个最小特征值对应的特征向量。

3 Python实现

3.1 算法流程

LLE算法流程如表所示,原理与第二节一一对应,不熟悉的同学可以往上翻

在这里插入图片描述

3.2 核心代码

LLE核心代码实现如下

def run(self, outDim):
     # 获得距离矩阵
     D = self.calDist()
     D[D < 0] = 0
     # 获得样本近邻索引矩阵
     DIndex = np.argsort(D, axis=1)[:, 1:self.k + 1]
     # 重构系数矩阵
     W = np.zeros([self.m, self.m])
     # 全1向量 kx1
     unitK = np.ones([self.k, 1])
     # 根据近邻样本确定重构参数
     for i in range(self.m):
         # Xi近邻距离矩阵
         Xi = self.X[:, i].reshape(self.d, 1) - self.X[:, DIndex[i, :]]
         # 求逆,附加项防止矩阵不稳定
         XiInv = np.linalg.pinv(np.dot(Xi.T, Xi) + np.eye(self.k) * self.tol)
         wi = np.dot(XiInv, unitK) / np.dot(np.dot(unitK.T , XiInv), unitK)
         for j in range(self.k):
             W[DIndex[i, j], i] = wi[j]
     # 计算M矩阵
     M = np.dot((np.eye(self.m) - W), (np.eye(self.m) - W).T)
     # 特征值分解
     eigVal, eigVec = np.linalg.eig(M)
     # 获取最小的d'个特征值对应的索引
     index = np.argsort(np.abs(eigVal))[1:outDim + 1]
     eigVec_ = eigVec[:, index]
     # 计算低维样本
     Z = eigVec_.T
     return Z

3.3 可视化

在这里插入图片描述

在这里插入图片描述

本文完整工程代码请通过下方名片联系博主获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

基于学生成绩管理系统(附源代码及数据库)

基于Ecplise&#xff0c;jsp的学生成绩管理系统 目录 登录页面 系统主页 管理员账号管理 学生查询 课程管理 成绩管理 后台数据库 源代码下载&#xff08;含数据库&#xff09; 毕设项目专栏 分为以下四大板块&#xff1a; 系统用户管理: 包含管理员账号管理&#…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDL 文章目录 5 实现&#xff1a;自适应线性单元&#x1f347;1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

第二十七章 Unity碰撞体Collision(下)

本章节我们继续研究碰撞体&#xff0c;并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程&#xff0c;然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时&#xff0c;两个球体都具备了碰撞体和刚体组件。接下来&#xff0c;我们Play运行查看效果 我们发现&…

第二十六章 Unity碰撞体Collision(上)

在游戏世界中&#xff0c;游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如&#xff0c;攻击怪物则是主角与怪物的碰撞&#xff0c;触发机关则是主角与机关的碰撞。在DirectX课程中&#xff0c;我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

浅谈区块链1.0-比特币

1. 比特币解决的问题 高度自治&#xff1a;国际经济危机无国界贸易&#xff1a;不同国家进行的贸易或者不同平台进行贸易 不可窜改&#xff1a;例如银行交易可能会被窜改数据 隐私安全&#xff1a;传统汇款方式会暴露你的个人信息&#xff0c;一旦数据库被别人入侵&#xff0c…

android基础知识复习

架构&#xff1a; 应用框架层&#xff08;Java API Framework&#xff09;所提供的主要组件&#xff1a; 名称功能描述Activity Manager&#xff08;活动管理器&#xff09;管理各个应用程序生命周期&#xff0c;以及常用的导航回退功能Location Manager&#xff08;位置管理器…

SpringBoot整合Mybatis-plus实现多级评论

在本文中&#xff0c;我们将介绍如何使用SpringBoot整合Mybatis-plus实现多级评论功能。同时&#xff0c;本文还将提供数据库的设计和详细的后端代码&#xff0c;前端界面使用Vue2。 数据库设计 本文的多级评论功能将采用MySQL数据库实现&#xff0c;下面是数据库的设计&…

Boonz-KeygenMe#1(★★★)

运行程序 错误&#xff1a; 查壳 没有壳&#xff0c;是汇编写的程序 载入OD 前面是在读取输入内容&#xff0c;到这里开始做计算了 分析 首先遍历了用户名&#xff0c;计算结果保存在EBX&#xff0c;在存放到 0x40E0F8 对EBX中的值再次计算&#xff0c;最后结果保存到 …

JavaFX: Java音乐播放读取歌词

JavaFX: Java音乐播放读取歌词 1、lrc歌词文件2、解析lrc歌词2.1 读取每行歌词2.2 解析歌词时间标签Time-tag2.3 解析歌词标识标签ID-tags2.4 创建对象包含歌词相关信息 3、播放显示歌词** 相关文献 JavaFX: Java音乐播放 1、lrc歌词文件 lrc歌词文件的扩展名 1、标准格式&a…

图像处理:Retinex算法

目录 前言 概念介绍 Retinex算法理论 单尺度Retinex&#xff08;SSR&#xff09; 多尺度Retinex&#xff08;MSR&#xff09; 多尺度自适应增益Retinex&#xff08;MSRCR&#xff09; Opencv实现Retinex算法 SSR算法 MCR算法 MSRCR算法 效果展示 总结 参考文章 前…

基频建模方法总结

基频F0建模方法 语音合成领域需要对基频进行建模&#xff0c;具体到文语转换TTS、语音转换VC、情感语音转换EVC领域等。 语音合成F0 包括文语转换&#xff0c;情感语音转换 TTEF&#xff1a;text-to-emotional-features synthesis EVC&#xff1a;emotional voice conversio…

这些你熟知的 app 和服务,都用上了人工智能

从微软在 Microsoft 365 服务中全面整合 GPT-4 能力 &#xff0c;让 PPT、Word 文档、Excel 表格的制作变成了「一句话的事」&#xff0c;到 Adobe 刚刚发布 Adobe Firefly模型集合&#xff0c;让图形设计、字体风格、视频渲染乃至 3D 建模的门槛显著降低——你我熟知的那些工…

idea的快捷键

一.idea的快捷键: 递进选择&#xff1a;ctrl w复制行&#xff1a;ctrl d删除行&#xff1a;ctrl y大小写切换&#xff1a;ctrl shift u展开/折叠&#xff1a;ctrl shift 减号/加号向前/向后&#xff1a;ctrl <— / —>Live Template(例如 输入psvm会自动打出mai…

华为OD机试题,用 Java 解【最远足迹】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不要…

Python实战项目:手势识别控制电脑音量

今天给大家带来一个OpenCV的实战小项目——手势识别控制电脑音量 先上个效果图&#xff1a; 通过大拇指和食指间的开合距离来调节电脑音量&#xff0c;即通过识别大拇指与食指这两个关键点之间的距离来控制电脑音量大小 技术交流 技术要学会分享、交流&#xff0c;不建议闭…

石英晶体振荡器【Multisim】【高频电子线路】

目录 一、实验目的与要求 二、实验仪器 三、实验内容与测试结果 1、观察输出波形&#xff0c;测量振荡频率和输出电压幅度 2、测量静态工作点的变化范围(IEQmin~IEQmax) 3、测量当静态工作点在上述范围时输出频率和输出电压的变化 4、测量负载变化对振荡频率和输出电压幅…

SpringCloud:微服务保护之初识Sentinel

1.初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。Sentinel官网 Sentinel具有以下特征&#xff1a; 丰富的应用场景&#xff1a;Sentinel承接了阿里巴巴近 10 年的双十一大促流量的核心场景&#xff0c;例如秒杀&#xff08;即突发流量控制在系统容量可以承受…

JavaEE阶段测试复习

文章全部内容在个人站点内的置顶文章中,访问密码:AIIT 小凯的宝库 模块三、面向对象 继承: a. 单继承:Java只支持单继承,即一个子类只能有一个直接父类。但子类可以间接地继承多个父类。 b. 构造方法与继承:在子类中可以通过super()关键字调用父类的构造方法。如果子类没…

探索深度学习中的计算图:PyTorch的动态图解析

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Windows系统的JDK安装与配置

1 选择JDK版本 以在Windows 64位平台上安装JDK 8版本为例。JDK 8 Windows版官网下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows 现在下载需要先注册并登录Oracle的账号。 2 安装 双击jdk安装包&#xff0c;进入安装程序页面直接选择…