论文精读-Semi-Supervised Classification with Graph Convolutional Networks

Semi-Supervised Classification with Graph Convolutional Networks

目录

  • Semi-Supervised Classification with Graph Convolutional Networks
    • 一、摘要
    • 介绍
    • 二、图上的快速近似卷积
      • 2.1 谱图卷积 (主要参考链接:[https://www.jianshu.com/p/35212baf6671](https://www.jianshu.com/p/35212baf6671))
        • 第一代GCN
        • 第二代GCN
        • 第三代GCN
          • 1. 为什么可以用切比雪夫多项式近似图卷积核?
          • 2. 如何用切比雪夫多项式近似图卷积核(近似的过程是怎样的)?
          • 3. 用切比雪夫多项式近似图卷积核的好处?
      • 2.2 分层线性模型
        • 如何理解线性?
    • 三、半监督节点分类

一、摘要

GCN是一种可扩展的方法,用于图结构数据的半监督学习,GCN在图上进行卷积操作。我们通过谱图卷积的局部一阶近似来激励卷积架构的选择。
模型在图边的数量上线性扩展,并学习编码局部图结构和节点特征的隐藏层表示。在引文网络和知识图谱数据集上的大量实验中,我们证明了我们的方法在很大程度上优于相关方法。

介绍

半监督学习:在图(如引文网络)中对节点(如文档)进行分类的问题,其中标签仅适用于一小部分节点。这个问题可以被框定为基于图的半监督学习。
其中标签信息通过某种形式的基于图的显式正则化在图上平滑,例如在损失函数中使用图拉普拉斯正则化项:

图拉普拉斯正则项
图拉普拉斯正则项是在基于图的半监督学习中常用的一种正则化项。它利用了图结构中节点之间的关系来平滑标签信息,从而提高预测的准确性。
图拉普拉斯矩阵是一个对称正定的矩阵,其定义与图的邻接矩阵和度矩阵有关。对于一个图中的节点,度矩阵是一个对角矩阵,其中每个对角元素表示该节点的度(即与该节点相连的边的数量)。邻接矩阵则表示节点之间的连接关系,其中非零元素表示节点之间存在连接或边。图拉普拉斯矩阵可以通过度矩阵和邻接矩阵的差来计算得到。
在半监督学习中,我们希望通过已知的标记数据来预测未标记数据的标签。图拉普拉斯正则项可以用来鼓励相邻节点具有相似的标签。具体而言,在损失函数中引入图拉普拉斯正则项,可以使预测结果在图上的相邻节点上保持一致性。
常见的图拉普拉斯正则项形式是基于节点的标签和相邻节点的标签之间的差异。例如,可以使用Laplacian regularization term来衡量预测结果与邻居节点标签之间的平滑程度。这样做可以鼓励相邻节点具有相似的标签,从而在未标记数据上推断出更准确的标签。
总之,图拉普拉斯正则项是在基于图的半监督学习中用于平滑标签信息的一种方法。通过引入图结构和正则化项,可以提高模型的泛化能力和预测准确性。

平滑标签信息
在图上平滑标签信息意味着通过图结构的连接关系,将相邻节点的标签进行一定程度的一致化。这是基于一个假设:在图中相邻的节点更有可能具有相似的标签。
在半监督学习中,我们通常只有一小部分数据点被标记,而大部分数据点是未标记的。为了更好地利用未标记数据来提高模型性能,我们可以通过标记数据和未标记数据之间的图结构来传播和平滑标签信息。
平滑标签信息的方法可以使用不同的算法或技术。其中,常见的方法之一是标签传播(Label Propagation)。该方法首先使用已标记的节点来初始化标签,然后通过迭代更新未标记节点的标签。更新标签时,会考虑相邻节点的标签,并根据它们的相似性进行调整,使得相邻节点具有相似的标签。
另一种常见的方法是使用图卷积神经网络(Graph Convolutional Networks,GCN)。GCN 利用图结构的邻接矩阵来定义卷积操作,通过多层卷积层的堆叠,从邻居节点汇聚信息并更新节点的表示。这样的操作可以促使相邻节点的特征表示趋于一致,进而实现标签的平滑
图拉普拉斯正则项也是一种常用的方法,如前面所提到的。通过在损失函数中引入图拉普拉斯正则化项,可以惩罚预测结果与邻居节点标签之间的差异,从而使得相邻节点具有相似的标签。
这些方法都旨在利用图结构中的连接关系来传播和平滑标签信息,以提高未标记数据的预测能力。通过在训练过程中结合标记数据和未标记数据,并利用图结构进行信息传播,我们可以更好地利用数据集中的信息,

在损失函数中使用图拉普拉斯正则化项:
在这里插入图片描述
文中指出图正则方法之前被用在传统的半监督节点分类中,通过在模型f(X)中加入正则项,如拉普拉斯正则,来捕捉图结构信息。其基本假设是相邻的节点可能具有相同的标签。然而这个假设可能会限制建模能力,因为图边不一定需要编码节点相似性,但可能包含额外的信息

如何理解上面这句话?(这个假设可能会限制建模能力,因为图边不一定需要编码节点相似性,但可能包含额外的信息)
上述话中提到的假设是指在图正则方法中,例如使用图拉普拉斯正则项时,基本假设是相邻节点可能具有相同的标签。这种假设的目的是通过图的连接关系来平滑标签信息,以提高模型的预测能力。
然而,这个假设可能会对建模能力产生一定的限制,因为图的边并不一定只编码节点的相似性,也可能包含其他类型的信息。这意味着相邻节点之间的连接关系可能不仅仅与它们的标签相似性相关
当图的边包含额外的信息时,简单地假设相邻节点具有相同标签可能无法充分捕捉到复杂的数据关系。这可能导致模型在处理具有较大差异的相邻节点时出现困难,从而影响了模型的表达能力和预测性能。
为了解决这个问题,可以考虑更加灵活的图正则方法,如使用自适应权重的图模型或更复杂的图卷积网络(Graph Convolutional Networks,GCN)。这些方法可以通过学习适应性的图结构来考虑节点之间的更多关联性,并在模型中合理地利用边的额外信息。这样可以使模型更好地适应不同节点之间的差异和多样性。
因此,理解上述话的关键是认识到图正则方法中的基本假设以及其可能存在的限制。同时,我们也应该探索更加灵活和复杂的图模型方法,以实现更好的建模能力和预测性能。

GCN为了避开上面提到的限制性,

avoiding explicit graph-based regularization in the loss function.如何理解这句话
理解这句话的关键是要明确两个概念:显式图形正则化和损失函数。
首先,显式图形正则化是指在损失函数中明确地使用图结构来平滑标签信息的方法,例如通过引入图拉普拉斯正则项。这种方法将图的连接关系作为额外的正则化项,以鼓励相邻节点具有相似的标签。
而损失函数是用来衡量模型预测与真实标签之间的差异的函数。它是训练模型时所优化的目标函数,通过最小化损失函数来调整模型参数,使其能够更准确地预测标签。
因此,“avoiding explicit graph-based regularization in the loss function” 的意思是避免在损失函数中明确使用基于图的正则化方法。
这可能是因为显式图形正则化方法有时存在一些限制或不足之处。例如,当图的边并不完全代表节点间的相似性时,显式图形正则化可能无法有效地平滑标签信息。此外,引入额外的正则化项可能会增加模型的复杂性和计算成本。
因此,避免使用显式图形正则化方法,并不意味着完全忽视图结构。相反,可以考虑其他方法来利用图结构,例如使用更灵活的图卷积网络(GCN)或自适应权重的图模型。这些方法可以通过学习适应性的图结构来考虑节点之间的关联性,而无需明确将图正则化作为损失函数的一部分。
综上所述,“avoiding explicit graph-based regularization in the loss function” 的含义是避免在损失函数中直接使用基于图的正则化方法,而尝试其他利用图结构的方法来平滑标签信息。

论文的第二部分和第三部分分别讲述了GCN的“图上的快速近似卷积”和“半监督节点分类”

二、图上的快速近似卷积

如何理解下面这个公式?
在这里插入图片描述
参考文章:https://zhuanlan.zhihu.com/p/71200936
在这里插入图片描述
上面的公式看起来像不像这个: H ( l + 1 ) = f ( H ( l ) , A ) H^{(l+1)} = f(H^{(l)}, A) H(l+1)=f(H(l),A),这个不就是前文提到的 f ( X , A ) f(X,A) f(X,A)
其中输入层 H ( 0 ) = X H^{(0)} = X H(0)=X , 输出层 H ( l ) = Z H^{(l)} = Z H(l)=Z , l l l 是层数。
在这里插入图片描述

模型的一种理解是:每一个节点下一层的信息 H ( l + 1 ) H^{(l+1)} H(l+1)是由前一层本身的信息 H ( l ) H^{(l)} H(l)以及相邻的节点的信息 A A A加权加和得到,然后再经过线性变换 W W W 以及非线性变换 σ ( ) \sigma() σ()

2.1 谱图卷积 (主要参考链接:https://www.jianshu.com/p/35212baf6671)

第一代GCN

在这里插入图片描述
对于这里的公式中 x x x,有一点疑问,结合网上的资料 x x x应该是Graph中每个节点特征的表示向量,而不是一个标量,但是文中的括号内又说是每个节点的标量,所以有点困惑,但我还是按照向量来理解。
这里的 x x x确实是一个N维的向量,这里的N指的是图中节点的个数,这个向量的每个元素代表的并不是每个节点的特征(因为一般特征也是个向量,不是标量),而是看做这个节点的信号。

在图神经网络(Graph Neural Networks,GNN)中,每个节点的信号标量是指该节点的特征向量中的一个标量值。通常情况下,每个节点都有一个特征向量,其中包含了该节点的各种属性或特征信息。
在传统的GNN模型中,每个节点的特征向量由多个维度组成,可以表示该节点的不同属性,比如节点的位置、度数、邻居节点的信息等。这些特征向量可以用来描述节点的状态、性质或者其他重要的信息。
对于每个节点的信号标量,则是从节点的特征向量中提取出来的一个具体的标量值,通常通过将特征向量进行线性变换或应用某种激活函数来得到。这个信号标量可以被视为节点的激活程度或重要程度的度量,它可以用来影响节点的后续计算或传播过程。
需要注意的是,在图神经网络中,并非所有的模型都需要使用信号标量。一些简单的GNN模型,比如Graph Convolutional Networks(GCN),只考虑节点之间的连接关系,并没有显式地对每个节点生成信号标量。而一些更复杂的GNN模型,比如GraphSAGE和GIN,会在节点上生成具体的信号标量,以便更好地刻画节点的特征和激活程度。
总结来说,每个节点的信号标量是在GNN模型中对节点特征进行处理得到的一个标量值,用于描述节点的激活程度或重要程度,并参与后续的计算和传播过程。

疑问与猜测:
此处公式最右边的 x x x是不是没有实际的含义,在这里出现只是因为原理推导的需要,因为看论文到后面可以看到公式中将此 x x x换成了 N ∗ C N*C NC的矩阵,表示所有节点的特征向量的堆放。
在这里插入图片描述

公式中,gθ(Λ)表示函数 gθ 在图拉普拉斯算子的特征值 Λ 上的作用。gθ(Λ)就是卷积核。具体来说,gθ 是一个函数,其输入是图拉普拉斯算子的特征值 Λ,并输出一个新的函数。
在这种情况下,gθ(Λ) 表示将函数 gθ 应用于图拉普拉斯算子的特征值 Λ。换句话说,对 Λ 中的每个特征值 λ_i,通过函数 gθ 对其进行变换得到新的值 gθ(λ_i)。
这个函数 gθ 可以是任意定义的,根据具体问题和需要来确定。在图卷积网络(GCN)中,gθ 通常是一个参数化的非线性激活函数,如ReLU或sigmoid函数等。通过将 gθ(Λ) 应用于图拉普拉斯算子的特征值,可以对图中的节点特征进行变换和聚合,以获得更丰富和更具表达力的表示。

上面为第一代GCN,第一代GCN的缺点也是显而易见的,主要有以下几点:

  1. 需要对拉普拉斯矩阵进行特征分解,每次前向传播的过程中都要计算矩阵乘法,当Graph规模较大时,时间复杂度为 O ( n 2 ) O(n^2) O(n2),非常耗时。
  2. 卷积核的个数为 n n n,就是节点的个数,因此当Graph中节点的个数 n n n很大时,节点特征更新缓慢。
第二代GCN

在这里插入图片描述

第三代GCN

在这里插入图片描述

1. 为什么可以用切比雪夫多项式近似图卷积核?

https://zhuanlan.zhihu.com/p/138420723

卷积核可以设计成任意形式的函数,当然也可以是Chebyshev多项式。计算复杂有论文说是可以降低

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

2. 如何用切比雪夫多项式近似图卷积核(近似的过程是怎样的)?

https://zhuanlan.zhihu.com/p/106687580

3. 用切比雪夫多项式近似图卷积核的好处?

[1] 卷积核只有 K + 1 K+1 K+1 个可学习的参数,一般来说K是远小于n的,参数的复杂度大大降低了。

[2] 采用切比雪夫多项式代替谱域卷积核后,经过公式的推导,ChebNet不需要对拉普拉斯矩阵做特征分解了。

[3] 卷积核具有严格的空间局部性。K 就是卷积核的“感受野半径”。也就是将中心顶点的K阶邻居节点作为邻域节点。

卷积核的参数从原先一代GCN中的n个减少到k个,从原先的全局卷积变为现在的局部卷积,即将距离中心节点k-hop的节点作为邻居节点。

印象中不知出处的知识点:

  1. 做卷积操作时,不一定要讲图中所有节点的特征都汇聚到某个节点,类似于人在社会里的关系,一个人最多与周围几十个人关系密切,而对于更远的关系,反而影响不大。对应的图的信息传递中,可以只考虑k跳范围的(邻居)节点,而不用考虑图中所有的节点。
    GCN中切比雪夫多项式迭代的K的值只取了1,有人说最前面的两个已经包含了大部分的信息。

2.2 分层线性模型

GCN(Graph Convolutional Network)采用了分层线性模型,这是指GCN模型的每一层都采用线性变换的方式进行特征传播和聚合。
在GCN中,每一层的输出特征表示是由上一层的输入特征表示经过以下步骤计算得到的:
线性变换:通过将上一层的输入特征表示与卷积核参数矩阵进行乘法运算,对每个节点的特征进行线性变换。这个线性变换可以表示为 h ( l + 1 ) = σ ( D ^ − 1 / 2 A ^ D ^ − 1 h ( l ) W ( l ) ) h^{(l+1)} = \sigma(\hat{D}^{-1/2}\hat{A}\hat{D}^{-1}h^{(l)}W^{(l)}) h(l+1)=σ(D^1/2A^D^1h(l)W(l)),其中 h ( l ) h^{(l)} h(l) 是第 l 层的输入特征表示, A ^ \hat{A} A^ 是带有自环的邻接矩阵(通常是图的标准化邻接矩阵), D ^ \hat{D} D^ 是度矩阵的归一化形式, W ( l ) W^{(l)} W(l) 是第 l 层的卷积核参数矩阵, σ \sigma σ 是激活函数。
特征聚合:将每个节点的邻居节点的特征表示进行加权平均,并与当前节点的特征表示进行融合。这个加权平均的过程实际上是通过上一步中的线性变换得到的特征表示与邻接矩阵相乘的结果实现的。
通过不断堆叠这样的分层线性模型,GCN可以逐渐传播和聚合节点特征,从而获得更高级别的表示。随着层数的增加,GCN模型可以捕捉到更广阔范围的图结构信息,并提高建模能力。
与传统的非线性神经网络不同,GCN采用的是分层线性模型,这意味着每一层的变换都是线性的,并且每一层都利用了上一层的输入特征进行计算。这种模型形式具有较好的可解释性和计算效率,并在图数据领域取得了良好的效果。

如何理解线性?

在GCN的分层线性模型中,"线性"指的是每一层的特征传播和聚合过程是通过线性变换来实现的。
这个线性变换实际上是一个矩阵乘法操作,它将每个节点的输入特征与卷积核参数相乘,并对邻居节点的特征进行加权平均。这样,每个节点都会根据其邻居节点的信息进行更新和聚合。通过这种线性变换,GCN可以在每一层中引入参数来捕捉节点之间的关系和结构。
需要注意的是,GCN的线性变换仅限于节点特征的传播和聚合过程。在每一层后面,通常会采用非线性激活函数(如ReLU)来引入非线性变换,并增加模型的表达能力。这些非线性操作允许模型更好地适应复杂的图数据。
总结起来,GCN的分层线性模型中的线性指的是每一层节点特征的传播和聚合是通过线性变换实现的。这种线性变换利用卷积核参数矩阵对节点特征进行线性组合,并通过邻接矩阵对邻居节点的特征进行加权平均。通过堆叠多个这样的线性变换层,GCN可以逐步传播和聚合节点特征,从而获得丰富的表示能力。

在这里插入图片描述
对上面的模型再做一些限制:令K=1, λ m a x ≈ 2 \lambda_{max}\approx 2 λmax2,得到
在这里插入图片描述

这里我们只选取了切比雪夫多项式阶数 K = 1 K=1 K=1的情况,因此只能建立起一阶邻居的依赖,所以只能通过堆积多层图卷积网络来建立 K K K阶邻居的感受野,但是这样的好处是我们通过一阶近似建立的线性图卷积模型,在堆叠图卷积层过程中不再受到切比雪夫多项式的限制,而且降低了运算的复杂度。
又令在这里插入图片描述在这里插入图片描述
进行renormalization trick(重整化方法)的原因是当GCN有好多层时,多次使用在这里插入图片描述这个算子时会出现数值不稳定和梯度消失/爆炸的问题,使用renormalization trick方法后可以缓解这个问题,实验证明确实如此。
在这里插入图片描述
最后将向量 x x x扩展为矩阵 X X X,对应的切比雪夫系数也从标量 θ \theta θ扩展为矩阵 Θ \Theta Θ F F F是滤波器的个数(等于输出层特征图的个数), N N N是节点的个数, C C C是每个节点特征的个数(也可以说是输入通道数),

在Graph Convolutional Network (GCN) 中,输出层的特征图的个数与GCN模型的层数一般是相关的,但不一定直接相等
输出层的特征图的个数通常由任务需求和具体问题决定。对于节点分类任务,输出层的特征图的个数通常等于类别的数量,每个特征图对应一个类别,以便进行分类预测。而对于图级别的任务,如图分类或图属性预测,输出层的特征图的个数通常等于任务的标签数量。
然而,GCN模型的层数并不直接决定输出层特征图的个数。GCN模型中的每一层都可以生成多个特征图,这些特征图可以包含不同抽象级别的特征表达。通过增加GCN的层数,模型可以逐渐学习到更高级别的特征,从而提高对复杂数据的建模能力。但是在输出层之前,可能会使用其他机制(如全局池化、投影操作)来减少特征图的数量,并将其转换为最终所需的输出维度。

三、半监督节点分类


回头再看GCN:
https://www.zhihu.com/question/54504471

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解进程:计算机中的任务管理与隔离

什么是进程? 进程是一个独立的执行环境,包括自己的内存空间、程序计数器、文件句柄等。每个进程都是操作系统的一个独立实例,它们之间通常相互隔离。 通俗来说,进程就是程序的一次执行过程,程序是静态的,它…

记录:R语言生成热图(非相关性)

今天解决了一个困扰了我很久的问题,就是如何绘制不添加相关性的热图。一般绘制热图是使用corrplot包画相关性图,但是这样有一个前提,就是输入的数据集必须进行相关性分析。那么如果我不需要进行相关性分析,而是直接绘制能够反应数…

Unity MRTK Hololens2眼动交互

/** ** UnityVersion : 2021.3.6f1* Description : 眼部交互基类* Author: * CreateTime : 2023-10-11 09:43:20* Version : V1.0.0* * */using System.Collections.Generic; using Microsoft.MixedReality.Toolkit.Input; using UnityEngine;namespace MRTKExtend.EyeTrackin…

flask vue跨域问题

问题: 调试时候跨域访问报: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response. 解决办法: 安装flask_cros from flask_cors import CORS CORS(app) app.after_request def a…

探索乡村新风貌:VR全景记录乡村发展,助力乡村振兴

引言: 中国乡村正经历着巨大变革,长期以来,乡村地区一直面临着人口外流、资源匮乏等问题。然而,近年来,政府的政策支持以及新兴技术的崭露头角,如虚拟现实(VR)全景记录,…

22字符串-简单反转

目录 BM(Boyer-Moore) 坏字符 好后缀 什么情况用哪个规则? LeetCode之路——151. 反转字符串中的单词 分析: 字符串匹配中除了简单的BF(Brute Force)、RK(Rabin-Karp)算法,还有…

PPO算法逐行代码详解

前言:本文会从理论部分、代码部分、实践部分三方面进行PPO算法的介绍。其中理论部分会介绍PPO算法的推导流程,代码部分会给出PPO算法的各部分的代码以及简略介绍,实践部分则会通过debug代码调试的方式从头到尾的带大家看清楚应用PPO算法在car…

iMazing2023免费版苹果iPhone手机备份应用软件

iMazing是一款功能强大的苹果手机备份软件,它可通过备份功能将通讯录备份到电脑上,并在电脑端iMazing“通讯录”功能中随时查看和导出联系人信息。它自带Wi-Fi自动备份功能,能够保证通讯录备份数据是一直在动态更新的,防止手机中新…

webdriver.Chrome()没反应

今天学习爬虫安装selenium之后刚开始webdriver.Chrome()正常 后面运行突然卡在这一步了 百度发现是版本不匹配 我们下载旧版本的chrome Download Google Chrome 95.0.4638.69 for Windows - Filehippo.com 禁用chrome的自动更新 打开文件所在位置 点击Google文件夹 右键up…

HDLbits: Lemmings3

Lemmings又多了一种状态:dig,我按照上一篇文章里大神的思路又多加了两种状态:LEFT_DIGGING与RIGHT_DIGGING,写出了如下的代码: module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk …

【Java 进阶篇】JavaScript 与 HTML 的结合方式

JavaScript是一种广泛应用于Web开发中的脚本语言,它与HTML(Hypertext Markup Language)结合使用,使开发人员能够创建交互式和动态的网页。在这篇博客中,我们将深入探讨JavaScript与HTML的结合方式,包括如何…

图像滤波总结

中值滤波器 中值滤波器是一种常用的非线性滤波器,其基本原理是:选择待处理像素的一个邻域中各像素值的中值来代替待处理的像素。主要功能使某像素的灰度值与周围领域内的像素比较接近,从而消除一些孤立的噪声点,所以中值滤波器能够…

超美!ChatGPT DALL-E 3已可用,另外GPT-4可上传图片进行问答

今天,在ChatGPT里使用DALL-E 3的功能终于上线了。以下是截图: 在GPT-4下加了一个菜单入口,名为 DALL-E 3,这也意味着ChatGPT免费账户暂时不能使用这个功能。 我们体验一下这个功能。 技术交流 建了技术交流群!想要进…

解决echarts配置滚动(dataZoom)后导出图片数据不全问题

先展现一个echarts&#xff0c;并配置dataZoom&#xff0c;每页最多10条数据&#xff0c;超出滚动 <div class"echartsBox" id"echartsBox"></div>onMounted(() > {nextTick(() > {var chartDom document.getElementById(echartsBox);…

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(二)

接来下在PC端安装和配置Charles&#xff0c;方法同下面链接&#xff0c;不再赘述。在模拟器上安装magisk实现Charles抓https包&#xff08;二&#xff09;_小小爬虾的博客-CSDN博客 一、记录下本机IP和代理端口 二、在手机模拟器上设置代理192.168.31.71:8888&#xff0c;设置…

接口自动化测试_L1

目录&#xff1a; 接口自动化测试框架介绍 接口测试场景自动化测试场景接口测试在分层测试中的位置接口自动化测试与 Web/App 自动化测试对比接口自动化测试与 Web/App 自动化测试对比接口测试工具类型为什么推荐 RequestsRequests 优势Requests 环境准备接口请求方法接口请求…

LeetCode【118】杨辉三角

题目&#xff1a; 解析&#xff1a; 该题目解析起来更像是数学推导&#xff0c;找到里面的规律 1、第n行有n个元素 2、第i行第j个元素&#xff0c;为第i-1行&#xff0c;j-1个元素和j个元素的和 3、每行第一个&#xff0c;最后一个元素是1 代码&#xff1a; public List<…

Docker 的数据管理和网络通信

目录 Docker 的数据管理 管理 Docker 容器中数据的方式 端口映射 容器互联&#xff08;使用centos镜像&#xff09; Docker 镜像的创建 Dockerfile 操作常用的指令 编写 Dockerfile 时格式 Dockerfile 案例 Docker 的数据管理 管理 Docker 容器中数据的方式 管理 Doc…

STM32使用HAL库驱动DS3231

1、STM32通讯口配置 启动IIC&#xff0c;默认配置即可。 2、头文件 #ifndef __DS3231_H #define __DS3231_H#include "main.h"#define DS3231_COM_PORT hi2c1 /*通讯端口*//**************************** defines *******************************/ #define DS3231…

cocos2d-x C++与Lua交互

Cocos版本&#xff1a; 3.10 Lua版本&#xff1a; 5.1.4 环境&#xff1a; window Visual Studio 2013 Lua Lua作为一种脚本语言&#xff0c; 它的运行需要有宿主的存在&#xff0c;通过Lua虚拟栈进行数据交互。 它的底层实现是C语言&#xff0c;C语言封装了很多的API接口&a…