SGC:简化图卷积网络 《Simplifying Graph Convolutional Networks》

论文地址:https://arxiv.org/abs/1902.07153

一、简介

​ 图卷积神经网络(Graph Convolutional Networks,GCNs\text{Graph Convolutional Networks,GCNs}Graph Convolutional Networks,GCNs)是卷积神经网络在图数据上的变体,其通过在非线性函数前堆叠若干个一阶谱过滤器来学习图数据的表示。近期,GCNs\text{GCNs}GCNs及其变体在各种图应用领域都实现了state-of-the-art。但是,由于GCNs\text{GCNs}GCNs是在神经网络“复兴”后提出的,因此不可避免的继承了神经网络的复杂性和难以解释性。

​ 本文认为对于那些需求低的应用来说,GCNs\text{GCNs}GCNs继承自神经网络的复杂性是不必要的。因此,本文的目标是推断出在GCN\text{GCN}GCN之前基于"传统"路径能够获得的最简单模型。具体来说,本文通过移除GCNs\text{GCNs}GCNs层之间的非线性并简化结果函数为单一线性变换,从而减少了GCNs\text{GCNs}GCNs的额外复杂性。实验显示,最终得到的模型可以与GCNs\text{GCNs}GCNs像媲美,且计算效率更高、拟合参数更少。本文将这个模型称为SGC(Simple Graph Convolution)\text{SGC(Simple Graph Convolution)}SGC(Simple Graph Convolution)。

​ 直觉上,SGC\text{SGC}SGC是可解释的,且本文从图卷积的角度提供了理论分析。SGC\text{SGC}SGC中的特征抽取对应于单个固定的过滤器。Kipf&Welling\text{Kipf\&Welling}Kipf&Welling发现renormalization trick\text{renormalization trick}renormalization trick能够改善任务准确率,本文证明这个方法能够有效的缩小图的谱域,且应用在SGC\text{SGC}SGC上能够产生低通过滤器。

​ 通过在基准数据集上的评估,展示了SGC\text{SGC}SGC能够与GCNs\text{GCNs}GCNs及其他state-of-the-art图神经网络媲美。然而,SGC\text{SGC}SGC的速度会快很多,甚至在最大的评估数据集上比FastGCN\text{FastGCN}FastGCN快2个数量集。此外,本文还证明了SGC\text{SGC}SGC能够有效的扩展至下游任务中。

二、方法

​ GCNs\text{GCNs}GCNs将带有部分标签的节点作为输入,并为图中的所有节点生成预测标签。形式化地,定义一个图为G=(V,A)\mathcal{G}=(\mathcal{V},\textbf{A})G=(V,A),其中V\mathcal{V}V表示由节点{v1,…,vn}\{v_1,\dots,v_n\}{v1​,…,vn​}组成的顶点集合;A∈Rn×n\textbf{A}\in\mathbb{R}^{n\times n}A∈Rn×n是对称邻接矩阵,其中aija_{ij}aij​表示节点viv_ivi​和vjv_jvj​的权重,缺失的边通过aij=0a_{ij}=0aij​=0来表示。定义度矩阵D=diag(d1,…,dn)\textbf{D}=\text{diag}(d_1,\dots,d_n)D=diag(d1​,…,dn​)为一个对角矩阵,其对角线上的每个分量是等于邻接矩阵的行求和di=∑jaijd_i=\sum_j a_{ij}di​=∑j​aij​。

​ 图中的每个节点viv_ivi​对应一个ddd维特征向量xi∈Rd\textbf{x}_i\in\mathbb{R}^dxi​∈Rd。整个特征矩阵X∈n×d\textbf{X}\in\mathbb{n\times d}X∈n×d则是堆叠了nnn个特征向量,即X=[x1,…,xn]⊤\textbf{X}=[\textbf{x}_1,\dots,\textbf{x}_n]^\topX=[x1​,…,xn​]⊤。每个节点都属于CCC个类别中的一个,并使用CCC维one-hot编码向量yi∈{0,1}C\textbf{y}_i\in\{0,1\}^Cyi​∈{0,1}C表示。

​ 模型仅知道一部分节点的标签,并希望预测节点的未知标签。

1. 图卷积神经网络GCN\text{GCN}GCN

​ 类似于CNN\text{CNN}CNN或者MLP\text{MLP}MLP,GCN\text{GCN}GCN也是通过多个层来从每个节点的特征xi\textbf{x}_ixi​中学习新的特征表示,并用线性分类器进行分类。对于第kkk个图卷积层来说,所有节点的输入表示为矩阵H(k−1)\textbf{H}^{(k-1)}H(k−1),输出节点表示为H(k)\textbf{H}^{(k)}H(k)。自然而然地,初始化节点表示就是原始输入的特征:
H(0)=X(1)\textbf{H}^{(0)}=\textbf{X} \tag{1} H(0)=X(1)
其作为第1个GCN\text{GCN}GCN的输入。

​ 一个K\text{K}K层的GCN\text{GCN}GCN等同于在图中的每个节点特征xi\textbf{x}_ixi​上应用K\text{K}K层的MLP\text{MLP}MLP,且每个节点的向量表示都是平均了其邻居节点的表示。在每个图卷积层中,节点的向量表示会在三个阶段被更新:(1) 特征传播;(2) 线性变换; (3) 非线性激活函数。

1.1 特征传播

​ GCN\text{GCN}GCN与MLP\text{MLP}MLP的主要区别就是特征传播。在每层的开始,每个节点viv_ivi​的特征hi\textbf{h}_ihi​是平均了它局部邻居的特征向量
hˉi(k)←1di+1hi(k−1)+∑j=1naij(di+1)(dj+1)hj(k−1)(2)\bar{\textbf{h}}_i^{(k)}\leftarrow\frac{1}{d_i+1}\textbf{h}_i^{(k-1)}+\sum_{j=1}^n\frac{a_{ij}}{\sqrt{(d_i+1)(d_j+1)}}\textbf{h}_j^{(k-1)} \tag{2} hˉi(k)​←di​+11​hi(k−1)​+j=1∑n​(di​+1)(dj​+1)​aij​​hj(k−1)​(2)
为了更加紧凑,这里将整个图上的更新表示为简单的矩阵操作。具体来说,令S\textbf{S}S表示规范化邻接矩阵
S=D~−1/2A~D~−1/2(3)\textbf{S}=\tilde{\textbf{D}}^{-1/2}\tilde{\textbf{A}}\tilde{\textbf{D}}^{-1/2} \tag{3} S=D~−1/2A~D~−1/2(3)
其中,A~=A+I\tilde{\textbf{A}}=\textbf{A+I}A~=A+I且D~\tilde{\textbf{D}}D~是A~\tilde{\textbf{A}}A~的度矩阵。那么,等式(2)(2)(2)中所有节点的同步更新能够简化为一个稀疏矩阵乘法
H~(k)←SH(k−1)(4)\tilde{\textbf{H}}^{(k)}\leftarrow \textbf{SH}^{(k-1)} \tag{4} H~(k)←SH(k−1)(4)
直觉上,这步操作沿着图的边平滑了局部向量表示,并且鼓励局部的点具有相似的预测。

1.2 线性变换与非线性激活

​ 经过局部平滑后,GCN\text{GCN}GCN层与MLP\text{MLP}MLP层等价。每个层都被关联一个可学习权重Θ(k)\Theta^{(k)}Θ(k),用于对经过平滑的特征向量进行线性变换。最后,在特征向量H(k)\textbf{H}^{(k)}H(k)输出前,使用ReLU\text{ReLU}ReLU这样的非线性激活函数对输出进行变换。整体来说,第kkk层的向量表示更新规则为
H(k)←ReLU(H~(k)Θ(k))(5)\textbf{H}^{(k)}\leftarrow \text{ReLU}(\tilde{\textbf{H}}^{(k)}\Theta^{(k)}) \tag{5} H(k)←ReLU(H~(k)Θ(k))(5)

1.3 分类器

​ 类似于MLP\text{MLP}MLP,对于节点分类任务,GCN\text{GCN}GCN会在最后一层使用softmax\text{softmax}softmax分类器预测标签概率。nnn个节点的类别预测表示为Y^∈Rn×C\hat{\textbf{Y}}\in\mathbb{R}^{n\times C}Y^∈Rn×C,其中y^ic\hat{y}_{ic}y^​ic​表示节点iii属于类别ccc的概率。GCN\text{GCN}GCN第KKK层的类别预测记为
Y^GCN=softmax(SH(K−1)Θ(K))(6)\hat{\textbf{Y}}_{\text{GCN}}=\text{softmax}(\textbf{SH}^{(K-1)}\Theta^{(K)}) \tag{6} Y^GCN​=softmax(SH(K−1)Θ(K))(6)
其中,softmax(x)=exp(x)/∑c=1Cexp(xc)\text{softmax}(\textbf{x})=\text{exp}(\textbf{x})/\sum_{c=1}^C\text{exp}(x_c)softmax(x)=exp(x)/∑c=1C​exp(xc​)。

2. SGC(Simple Graph Convolution)\text{SGC(Simple Graph Convolution)}SGC(Simple Graph Convolution)

​ 在传统的MLP\text{MLP}MLP层中,更深的层能够增加表达能力。因此,深层的MLP\text{MLP}MLP能够构建特征的层次结构,即第二层的特征是在第一层特征的基础上构建的。在GCNs\text{GCNs}GCNs中,这些层还有第二个重要作用:每层的隐藏表示会被其一跳邻居平均。这也意味着,一个经过kkk层的阶段特征来源于其在图中的所有kkk跳邻居。这种方式类似于卷积神经网络,模型深度增加的同时也增加了特征的感知域。虽然随着深度的增加,卷积网络的效果会变好,但是典型的MLP\text{MLP}MLP在3或4层之后就收益很小了。

2.1 线性化

​ 假设两个GCN\text{GCN}GCN层间的非线性变换并不是必须的,模型的收益主要来自于局部平均。那么,移除每层的非线性变换并保留最后的softmax\text{softmax}softmax。这样得到的模型仍然是线性的,且与KKK层的GCN\text{GCN}GCN具有相同的感知域
Y^=softmax(S…SSXΘ(1)Θ(2)…Θ(k))(7)\hat{\textbf{Y}}=\text{softmax}(\textbf{S}\dots\textbf{SSX}\Theta^{(1)}\Theta^{(2)}\dots\Theta^{(k)}) \tag{7} Y^=softmax(S…SSXΘ(1)Θ(2)…Θ(k))(7)
为了简化表示,将规范化邻接矩阵的重复乘法表示为S\textbf{S}S的KKK次方法SK\textbf{S}^KSK。此外,将权重矩阵重新参数化为单一的矩阵Θ=Θ(1)Θ(2)…Θ(K)\Theta=\Theta^{(1)}\Theta^{(2)}\dots\Theta^{(K)}Θ=Θ(1)Θ(2)…Θ(K)。那么最终的分类器表示为
Y^SGC=softmax(SKXΘ)(8)\hat{\textbf{Y}}_{\text{SGC}}=\text{softmax}(\textbf{S}^K\textbf{X}\Theta) \tag{8} Y^SGC​=softmax(SKXΘ)(8)
本文将其称为SGC(Simple Graph Convolution)\text{SGC(Simple Graph Convolution)}SGC(Simple Graph Convolution)。

2.2 Logistic回归

​ 通过观察等式(8)(8)(8)能够获得SGC\text{SGC}SGC的直觉解释:分离特征抽取和分类器。即SGC\text{SGC}SGC可以看做是由一个固定的特征抽取/平滑组件Xˉ=SKX\bar{\textbf{X}}=\textbf{S}^K\textbf{X}Xˉ=SKX,后面跟一个线性logistic\text{logistic}logistic回归分类器Y^=softmax(XˉΘ)\hat{\textbf{Y}}=\text{softmax}(\bar{\textbf{X}}\Theta)Y^=softmax(XˉΘ)组成。由于Xˉ\bar{\textbf{X}}Xˉ不需要权重,因此计算Xˉ\bar{\textbf{X}}Xˉ就等价于特征预处理步骤。整个模型的训练就变成了在预处理特征Xˉ\bar{\textbf{X}}Xˉ上的直接进行多类别logistic\text{logistic}logistic回归。

三、谱分析(Spectral Analysis\text{Spectral Analysis}Spectral Analysis)

1. 图卷积

​ 图数据上的Fourier\text{Fourier}Fourier分析依赖于图Laplacian\text{Laplacian}Laplacian算子的谱分解。

​ 图Laplacian\text{Laplacian}Laplacian矩阵Δ=D-A\Delta=\textbf{D-A}Δ=D-A(规范化版本Δsym=D−1/2ΔD−1/2\Delta_{sym}=\textbf{D}^{-1/2}\Delta\textbf{D}^{-1/2}Δsym​=D−1/2ΔD−1/2)为对称正定矩阵。该矩阵的特征分解为Δ=UΛU⊤\Delta=\textbf{U}\Lambda\textbf{U}^\topΔ=UΛU⊤,其中U∈Rn×n\textbf{U}\in\mathbb{R}^{n\times n}U∈Rn×n是由正交特征向量组成,且Λ=diag(λ1,…,λn)\Lambda=\text{diag}(\lambda_1,\dots,\lambda_n)Λ=diag(λ1​,…,λn​)为特征值对角矩阵。Laplacian\text{Laplacian}Laplacian矩阵的特征分解能够允许在图域上定义等价的傅里叶变换,特征向量对应Fouries\text{Fouries}Fouries的模,特征值对应图上的频率。基于此,令x∈Rn\textbf{x}\in\mathbb{R}^nx∈Rn表示定义在图上顶点的信号,那么x\textbf{x}x的图上Fouries\text{Fouries}Fouries变换为x^=U⊤x\hat{\textbf{x}}=\textbf{U}^\top\textbf{x}x^=U⊤x且逆操作为x=Ux^\textbf{x}=\textbf{U}\hat{\textbf{x}}x=Ux^。因此,信号x\textbf{x}x和过滤器g\textbf{g}g的图卷积操作定义为
g∗x=U((U⊤g)⊙(U⊤x))=UG^U⊤x(9)\textbf{g}*\textbf{x}=\textbf{U}((\textbf{U}^\top\textbf{g})\odot(\textbf{U}^\top\textbf{x}))=\textbf{U}\hat{\textbf{G}}\textbf{U}^\top\textbf{x} \tag{9} g∗x=U((U⊤g)⊙(U⊤x))=UG^U⊤x(9)
其中,G^=diag(g^1,…,g^n)\hat{\textbf{G}}=\text{diag}(\hat{g}_1,\dots,\hat{g}_n)G^=diag(g^​1​,…,g^​n​)表示对角矩阵,其对角线元素对应谱过滤器系数。

​ 图卷积能够通过Laplacian\text{Laplacian}Laplacian的k阶多项式完成近似,
UG^U⊤x≈∑i=0kθiΔix=U(∑i=0kθiΛi)U⊤x(10)\textbf{U}\hat{\textbf{G}}\textbf{U}^\top\textbf{x}\approx\sum_{i=0}^k\theta_i\Delta^i\textbf{x}=\textbf{U}\Big(\sum_{i=0}^k\theta_i\Lambda^i\Big)\textbf{U}^\top\textbf{x} \tag{10} UG^U⊤x≈i=0∑k​θi​Δix=U(i=0∑k​θi​Λi)U⊤x(10)
其中,θi\theta_iθi​表示系数。在这个例子中,过滤器系数对应于Laplacian\text{Laplacian}Laplacian特征值的多项式,即G^=∑iθiΛi\hat{\textbf{G}}=\sum_i\theta_i\Lambda^iG^=∑i​θi​Λi或者相当于g^(λi)=∑iθiλji\hat{g}(\lambda_i)=\sum_i\theta_i\lambda_j^ig^​(λi​)=∑i​θi​λji​。

​ 图卷积神经网络利用了等式(10)(10)(10)的线性近似,该线性近似具有系数θ0=2θ\theta_0=2\thetaθ0​=2θ和θ1=−θ\theta_1=-\thetaθ1​=−θ。得到基本的GCN\text{GCN}GCN卷积操作
g∗x=θ(I+D−1/2AD−1/2)x(11)\textbf{g}*\textbf{x}=\theta(\textbf{I}+\textbf{D}^{-1/2}\textbf{AD}^{-1/2})\textbf{x} \tag{11} g∗x=θ(I+D−1/2AD−1/2)x(11)
在其最终的设计中,将矩阵I+D−1/2AD−1/2\textbf{I}+\textbf{D}^{-1/2}\textbf{AD}^{-1/2}I+D−1/2AD−1/2替换为规范化版本D~−1/2A~D~−1/2\tilde{\textbf{D}}^{-1/2}\tilde{\textbf{A}}\tilde{\textbf{D}}^{-1/2}D~−1/2A~D~−1/2,其中A~=A+I\tilde{\textbf{A}}=\textbf{A+I}A~=A+I且D~=D+I\tilde{\textbf{D}}=\textbf{D+I}D~=D+I。

2. SGC\text{SGC}SGC和低通滤波

​ GCN\text{GCN}GCN中初始的过滤器对应于传播矩阵S1-order=I+D−1/2AD−1/2\textbf{S}_{\text{1-order}}=\textbf{I}+\textbf{D}^{-1/2}\textbf{A}\textbf{D}^{-1/2}S1-order​=I+D−1/2AD−1/2。规范化拉普拉斯算子为Δsym=I−D−1/2AD−1/2\Delta_{\text{sym}}=\textbf{I}-\textbf{D}^{-1/2}\textbf{AD}^{-1/2}Δsym​=I−D−1/2AD−1/2,那么S1-order=2I−Δsim\textbf{S}_{\text{1-order}}=2\textbf{I}-\Delta_{\text{sim}}S1-order​=2I−Δsim​。因此,特征传播S1-orderK\textbf{S}_{\text{1-order}}^KS1-orderK​意味着过滤系数g^i=g^(λi)=(2−λi)K\hat{g}_i=\hat{g}(\lambda_i)=(2-\lambda_i)^Kg^​i​=g^​(λi​)=(2−λi​)K,其中λi\lambda_iλi​表示Δsym\Delta_{\text{sym}}Δsym​的特征值。上图展示了传播步骤K∈{1,…,6}K\in \{1,\dots,6\}K∈{1,…,6}的变化与S1-order\textbf{S}_{\text{1-order}}S1-order​过滤操作的关系。可以观察到,高阶S1-order\textbf{S}_{\text{1-order}}S1-order​将会导致过滤系数的爆炸并在频率λi<1\lambda_i<1λi​<1上过度放大。

​ 为了解决一阶过滤器的问题,Kipf&Welling\text{Kipf\&Welling}Kipf&Welling等人提出了renormalization trick\text{renormalization trick}renormalization trick。该方法通过为所有节点加入自循环后的归一化邻接矩阵来替换S1-order\textbf{S}_{\text{1-order}}S1-order​。本文称得到的传播矩阵为增强的归一化邻接矩阵S~adj=D~−1/2A~D~−1/2\tilde{\textbf{S}}_{adj}=\tilde{\textbf{D}}^{-1/2}\tilde{\textbf{A}}\tilde{\textbf{D}}^{-1/2}S~adj​=D~−1/2A~D~−1/2,其中A~=A+I\tilde{\textbf{A}}=\textbf{A+I}A~=A+I且D~=D+I\tilde{\textbf{D}}=\textbf{D+I}D~=D+I。相应的,定义增强规范化Laplacian\text{Laplacian}Laplacian矩阵Δ~sym=I−D~−1/2A~D~−1/2\tilde{\Delta}_{sym}=\textbf{I}-\tilde{\textbf{D}}^{-1/2}\tilde{\textbf{A}}\tilde{\textbf{D}}^{-1/2}Δ~sym​=I−D~−1/2A~D~−1/2。这样,就可以将关于S~adj\tilde{\textbf{S}}_{adj}S~adj​的谱过滤器描述为Laplacian\text{Laplacian}Laplacian矩阵特征值的多项式,即g^(λ~i)=(1−λ~i)K\hat{g}(\tilde{\lambda}_i)=(1-\tilde{\lambda}_i)^Kg^​(λ~i​)=(1−λ~i​)K,其中λ~i\tilde{\lambda}_iλ~i​是Δ~sym\tilde{\Delta}_{sym}Δ~sym​的特征值。

  • 定理1

    令A\textbf{A}A是一个无向、有权且无孤立点的简单图的邻接矩阵,其对应的度矩阵为D\textbf{D}D。令A~=A+γI\tilde{\textbf{A}}=\textbf{A}+\gamma\textbf{I}A~=A+γI为增强邻接矩阵(γ>0\gamma>0γ>0),其对应的度矩阵为D~\tilde{\textbf{D}}D~。令λ1\lambda_1λ1​和λn\lambda_nλn​表示Δsym=I−D−1/2AD−1/2\Delta_{sym}=\textbf{I}-\textbf{D}^{-1/2}\textbf{AD}^{-1/2}Δsym​=I−D−1/2AD−1/2的最小特征这和最大特征值。类似地,λ~1\tilde{\lambda}_1λ~1​和λ~n\tilde{\lambda}_nλ~n​则是Δ~sym=I−D~−1/2A~D~−1/2\tilde{\Delta}_{sym}=\textbf{I}-\tilde{\textbf{D}}^{-1/2}\tilde{\textbf{A}}\tilde{\textbf{D}}^{-1/2}Δ~sym​=I−D~−1/2A~D~−1/2的最小特征性和最大特征值。则有
    0=λ1=λ~1<λ~n<λn(12)0=\lambda_1=\tilde{\lambda}_1<\tilde{\lambda}_n<\lambda_n \tag{12} 0=λ1​=λ~1​<λ~n​<λn​(12)

定理1表明,在加入自循环γ>0\gamma>0γ>0后,规划化Laplacian\text{Laplacian}Laplacian矩阵的最大值变小。

【图神经网络】SGC:简化图卷积网络相关推荐

  1. 图神经网络通用框架信息传递网络(MPNNs)

    图神经网络通用框架信息传递网络(MPNNs) 介绍 机制 理论 信息传递阶段 读取阶段 实际案例 代码 第三方库 介绍 信息传递网络(Message Passing Neural Networks, ...

  2. 【论文解读|AAAI2021】HGSL - Heterogeneous Graph Structure Learning for Graph Neural Networks 图神经网络的异构图结构学习

    文章目录 1 摘要 2 引言 相关工作 3 方法 3.1 特征图产生器 3.1.1 特征相似图 3.1.2特征传播图 3.2 语义图生成器 4 实验 5 结论 论文链接: http://shichua ...

  3. 图神经网络基础--基于图神经网络的节点表征学习

    图神经网络基础–基于图神经网络的节点表征学习 引言 在图节点预测或边预测任务中,首先需要生成节点表征(Node Representation).我们使用图神经网络来生成节点表征,并通过基于监督学习的对 ...

  4. 图神经网络实践之图节点分类(一)

    本文主要以Deep Graph Library(DGL)为基础,利用图神经网络来进行图节点分类任务.本篇针对的图为同构图. 1. DGL 介绍 DGL是一个python包,用以在现有的深度学习框架上( ...

  5. activiti动态增加节点_图神经网络之动态图

    图这种结构普遍存在于人类社会生活中,如互联网中网页间的互相链接会构成图.网民购买商品会构成"网民-商品"图.人和人的交流会构成图.论文的互相引用也会构成图.有许多任务需要根据这些图 ...

  6. 基于图神经网络的异构图表示学习和推荐算法研究(完整代码+数据)

    基于图神经网络的异构图表示学习和推荐算法研究.包含基于对比学习的关系感知异构图神经网络(Relation-aware Heterogeneous Graph Neural Network with C ...

  7. 图神经网络系列-Graph图基本介绍、度中心性、特征向量中心性、中介中心性、连接中心性

    图神经网络系列-Graph图基本介绍.度中心性.特征向量中心性.中介中心性.连接中心性 目录 图的定义 图的类型 空图形 简单图 多重图 有向图 无向图 连通与断开图 正则图 完全图 循环图 二部图 ...

  8. 【图神经网络】简化 GCN(SGC)

    本文为图神经网络学习笔记,讲解 SGC.欢迎在评论区与我交流

  9. Lesson 16.5 在Pytorch中实现卷积网络(上):卷积核、输入通道与特征图在PyTorch中实现卷积网络(中):步长与填充

    卷积神经网络是使用卷积层的一组神经网络.在一个成熟的CNN中,往往会涉及到卷积层.池化层.线性层(全连接层)以及各类激活函数.因此,在构筑卷积网络时,需从整体全部层的需求来进行考虑. 1 二维卷积层n ...

  10. 【阿里云课程】图神经网络基础:图的应用、表示与图卷积

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第9课中的一节,介绍如下: 图神经网络基础 本次课程是阿里天池联合有三AI推出的深度学习系列课程第9期,讲述图神经网络,图的 ...

最新文章

  1. Zeppelin-源码编译
  2. Python基础学习笔记之(二)
  3. CSS Expression用法总结
  4. Data Guard组件等相关介绍
  5. BATJ等大厂最全经典面试题分享
  6. 编译运行Cube_slam
  7. Kruscal算法---最小生成树
  8. 软考初级程序员含金量高吗?有答案了
  9. 【Java系列】八大排序算法
  10. 清华大学计算机音乐,校长杯十强故事汇 || DeepMusic:音乐也能如此“深邃”
  11. 无线通信中多径传播包络服从瑞利衰落衰落MATLAB仿真
  12. 查看与设置华为路由器的版本信息,名称、时钟、登录提示
  13. POC原型开发:巡店
  14. 解密Kerberos流量
  15. IM敏感词算法原理和实现
  16. 4D毫米波雷达硬件系统架构
  17. js网页雪花效果jquery插件
  18. iPad 使用技巧:Apple Pencil
  19. MathJax基础教程和快速参考
  20. android手机必备app,5款安卓手机必备的黑科技APP!各个都是精品,一定要低调收藏使用...

热门文章

  1. Redis-Jedis
  2. 传奇假人自动上线_传奇商业脚本 各种M2防假人脚本大集合 传奇私服脚本
  3. 华为云大数据BI,助力零售企业迈入数智化新时代
  4. 数学分析教程(科大)——7.2笔记+习题
  5. Java工程师成神之路 | 2022正式版
  6. Centos7系统安装yum遇到的问题failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try. http:
  7. 关于JS运算,出现多余小数点尾数,浮点问题处理
  8. AE基础教程(15)——第15章 质量图标和效果开关
  9. PandoraBox运行Xware(迅雷远程下载)的试验
  10. 量化交易——传统技术分析相对强弱指数RSI的原理及实现