[学习笔记]CS224W

资料:

课程网址
斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】
斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲

图的基本表示

图是描述各种关联现象的通用语言。与传统数据分析中的样本服从独立同分布假设不一样,图数据自带关联结构,数据和数据,样本和样本之间有联系。

图神经网络是端到端的表示学习,无需人工特征工程,可以自动学习特征(类似CNN)。

图神经网络的目标是实现图嵌入,即将一个节点映射成d维向量,同时保证网络中相似的节点有相近的向量表示。这个d维向量应该包含节点在原图中的结构信息,语意信息,以方便后续的数据挖掘。

在这里插入图片描述

节点、连接、子图、全图都可以带有特征

不同的任务

在节点、连接、子图、全图层面,都可以进行图数据挖掘

  • 节点层面的案例:如信用卡欺诈
  • 连接层面的案例:如推荐可能认识的人
  • 子图层面的案例:如用户聚类
  • 全图层面的案例:全图层面的预测,如分子是否有毒;全图层面的生成,如生成新的分子结构

图的本体设计

图(network/graph)由节点(nodes/vertices)和连接(links/edges)组成。

节点的集合用N表示,连接的集合用E表示,整个图用G(N,E)表示。

本体图

图的设计牵涉到一个概念,本体图(Ontology)。本体图应该显示节点可能的类型,以及各类型节点(包括节点类型到其自身)之间可能存在的关系。如下图,是一个医疗领域的知识图谱的本体图。

如何设计本体图,取决于要解决的问题。如下图,例如要解决的问题是,什么疾病可以吃什么,那么疾病食物就需要设计成节点。可以吃不可以吃不推荐吃就应该设计成节点之间的关系

在这里插入图片描述

有时本体图是唯一、无歧义的,如社交网络
有时本体图不唯一,取决于你要研究的问题,如考虑红楼梦的家族,地点,事件等

图的种类(有向、无向、异质、二分、连接带权重)

图可以分为无向图有向图异质图(heterogeneous graph)、二分图。

  • 无向图:对称的、双向的图。如合作关系,facebook上的好友关系
  • 有向图:单向的图。如电话,Twitter上的关注
  • 异质图:节点和连接可能有不同的类型,是很多论文研究的重点
  • 二分图(Bipartite Graph):节点种类是2的异质图被称为二分图。如论文作者和论文的关系、用户和商品之间的关系

二分图可以展开,如下图,在节点集U中,如果两个节点都连接到V中的同一个节点,则在图Projection U中添加一条连接。
这样就可以将二分图转化为两张各自只有一类节点的图。
在这里插入图片描述

节点的度(Node degree)

  • 对于无向图

    • i个节点的度:记为 k i k_i ki,表示与第i个节点邻接的边的数量
    • 图的平均度: k ˉ = ⟨ k ⟩ = 1 N ∑ i = 1 N k i = 2 E N \bar{k}=\langle k\rangle=\frac{1}{N} \sum_{i=1}^N k_i=\frac{2 E}{N} kˉ=k=N1i=1Nki=N2E
  • 对于有向图

    • 入度:从别的节点指向当前节点的边的总数
    • 出度:从当前节点指向别的节点的边的总数
    • 节点的度=入度+出度
    • 图的平均度: k ˉ = E N \bar{k}=\frac{E}{N} kˉ=NE

      平均入度=平均出度,因为一个出度对应的边必然对应一个入度对应的边
      入度为0的节点称为Source,出度为0的节点称为Sink

节点的度可以一定程度上反应节点的重要程度

图的基本表示-邻接矩阵

  • 无向图
    如果第i个节点和第j个节点之间存在边,则邻接矩阵A A i j A_{ij} Aij A j i A_{ji} Aji对应的值为1

无向图对应的邻接矩阵是对称阵
如果没有自身到自身的环,则主对角线全为0

  • 有向图
    如果第i个节点存在指向第j个节点之间的边,则邻接矩阵A A i j A_{ij} Aij对应的值为1

有向图对应的邻接矩阵是非对称阵

邻接矩阵是稀疏的,如社交网络
在这里插入图片描述

图的基本表示-连接列表和邻接列表

如上面所示,用邻接矩阵来表示图,存在稀疏性问题,造成存储空间的浪费。

  • 连接列表:只记录存在连接的边和节点
    在这里插入图片描述
  • 邻接列表:对于一个给定节点,只记录他指向的节点和对应的边
    在这里插入图片描述

上述图是无权图,在邻接矩阵中的值非1即0,如果是带权图,则可以在邻接矩阵中将1改成权重。

图的连通性

  • 无向图中
    连通图(Connected graph):任意两个点都有一条路径可达,则称为连通图。
    不连通图虽然本身不连通,但是可以划分得到多个连通分支(connected components)。

    最大的连通分支被称为Giant Component
    孤立的节点称为Isolated node。
    不连通矩阵的邻接矩阵呈现出分块对角的形式
    如果存在一个节点将不连通图的两个连通分支连接上了,那么它会打破分块对角形式

  • 有向图中
    强连通的有向图:如果任意两个节点存在有向路径可达,则称为强连通的有向图。
    弱连通的有向图:如果忽略边的方向,即将它看成无向图,此时如果图是连通的,那么这个有向图称为弱连通的。

    对于有向图,可能整体不是强连通的,但其中的某个子图是强连通的,称为强连通分支(Strongly connected components(SCC))
    E和G指向SCC,称为In-componet、D和F是由SCC出发的,称为Out-component在这里插入图片描述

传统图机器学习的特征工程-节点

  • 总的思路
    本节用传统机器学习方法,做特征工程,人工设计一些特征,把节点,边,全图特征编码成d维向量,再用该向量进行后续机器学习预测。

  • 1.特征工程
    抽取d个特征,编码为d维向量。本节只考虑连接特征,不考虑属性特征。

    节点自己的特征,称为属性特征(Attributes)
    节点和图中其他节点的连接关系,称为连接特征。

  • 2.训练一个机器学习模型
    利用RF、SVM、NN等进行训练。

  • 3.应用模型
    给定一个新的节点/链接/图,获得图她的特征并做预测。

本节主要聚焦无向图,并针对节点、边、图层面做特征工程。

节点层面的特征工程

目标:区分节点在图中的结构和位置,可考虑的(连接)特征有:节点的度(Node degree)、节点的重要度(Node centrality)、聚类系数(Clustering coefficient)、子图模式(Graphlets)

聚合系数是指,与当前节点邻接的节点是否有联系。

Node degree

Node degree只考虑了邻接节点的数量,不能反应节点的质量

Node centrality

Node centrality考虑了节点在图中的重要度。有不同的方式来对此进行建模:

  • 特征向量重要度(Eigenvector centrality)
    思想:如果一个节点的邻接节点很重要,那么这个节点也很重要
    建模:
    c v = 1 λ ∑ u ∈ N ( v ) c u c_v=\frac{1}{\lambda}\sum_{u \in N(v)} c_u cv=λ1uN(v)cu

    λ \lambda λ是归一化系数,往往是A的最大特征值

    实现:这是一个递归问题,如何解决?
    上面公式等价于求解 λ c = A c \lambda \boldsymbol{c}=\boldsymbol{A c} λc=Ac

    可以发现, c \boldsymbol{c} c向量就是 A \boldsymbol{A} A的最大特征值对应的特征向量
    根据perron-frobenius定理,最大特征值 λ m a x \lambda_{max} λmax一定为正且唯一

  • Betweenness centrality
    思想:如果在任意两个节点间的最短路径中,有一个节点频繁出现,那么这个节点可以被认为是重要的
    建模:
    c v = ∑ s ≠ v ≠ t # ( shortest paths betwen  s and  t that contain  v ) # ( shortest paths between  s and  t ) c_v=\sum_{s \neq v \neq t} \frac{\#(\text { shortest paths betwen } s \text { and } t \text { that contain } v)}{\#(\text { shortest paths between } s \text { and } t)} cv=s=v=t#( shortest paths between s and t)#( shortest paths betwen s and t that contain v)
    在这里插入图片描述

  • Closeness centrality
    思想:如果一个节点到其他所有节点的路径都很短,那么这个节点可以被认为是重要的
    建模:
    c v = 1 ∑ u ≠ v shortest path length between  u and  v c_v=\frac{1}{\sum_{u \neq v} \text { shortest path length between } u \text { and } v} cv=u=v shortest path length between u and v1
    在这里插入图片描述

Clustering Coefficient

聚类系数(Clustering Coefficient),衡量一个节点的邻接节点的连接有多紧密。
建模:
e v = # ( edges among neighboring nodes ) ( k v 2 ) ∈ [ 0 , 1 ] e_v=\frac{\#(\text{edges among neighboring nodes})}{\binom{k_v}{2}}\in [0, 1] ev=(2kv)#(edges among neighboring nodes)[0,1]

v节点相邻节点两两组成的节点对计入分母
如果节点对中的两个节点相邻,那么这对节点对计入分子
在这里插入图片描述

Graphlets

一个节点的自我网络(ego-network)是指以一个节点为中心,只包含他和他邻接节点,以及这些节点之间的边的图。
可以发现,节点v的聚类系数本质上就是计数了节点v的自我网络中以v为顶点的三角形的个数。
这个三角形可以理解为我们预先定义的一类子图
那么如果修改这个预定义的子图类型,就可以得到新的计数特征,这个预定义的子图类型,就是我们下面要提到的graphlets

先看看子图、生成子图、导出子图的概念:
在这里插入图片描述

可以看到,从原图中取一些节点,并取这些节点所有出现的边可以构成导出子图。

下面给出Graphlets的精确定义,即有根连通导出异构子图(Rooted connected induced non-isomorphic subgraphs)
在这里插入图片描述

上图分别展示了2节点、3节点、4节点和5节点的graphlets,共有73种。
2个节点构成的子图中,可以定义1种类型的graphlet
3个节点构成的子图中,可以定义3种类型的graphlets

在右上角的例子中,节点u对应的graphlets类型有0、1、2、3、5、10、11、…
聚类系数中的三角形其实就是G2对应的graphlet。

下面引入Graphlets相关的特征向量:Graphlets Degree Vector(GDV),它一个基于给定节点,以它为根的各类graphlets的实例个数组成向量,如下面的例子。
在这里插入图片描述

注意,原图中没有以c为根结点的导出子图。
GDV描述了节点局部领域的拓扑结构信息,用一些已经定义好的子图模式去匹配,并计数每种模式下的数量。
比较两个节点的GDV向量,可以计算距离和相似度。
在NetworkX中,子图模式Graphlets被称为Atlas

总结

介绍的结构特征可以分为:

基于重要度的特征(描述节点中心度/重要度):

  • 节点的度
  • 不同节点的重要度度量

可用于预测有影响力的节点

基于结构的特征(描述节点的邻域拓扑连接结构):

  • 节点的度
  • 聚类系数
  • GDV

可用于预测节点在图中的功能,桥接、枢纽、中心

传统图机器学习的特征工程-连接

连接层面的预测任务:基于已知连接去预测(补全)未知连接。
在模型训练阶段,节点对被排序,top K节点对被预测。
关键是如何设计节点对的特征。

思路1:直接提取link的特征,变成d维向量。
思路2:把link两端的d维向量拼在一起,但是这会丢失link本身连接结构信息。

link prediction task有两种情况:

  1. 随机丢失连接:
    对于客观静态图,如蛋白质,分子,我们可以通过随机移除一些连接,并尝试预测它们

  2. 随时间变化的连接:
    对于如论文引用、社交网络、微信好友、学术合作等图,给定一段时间 [ t 0 , t 0 ′ ] [t_0, t_0^{'}] [t0,t0]的图,预测下一个时间段 [ t 1 , t 1 ′ ] [t_1, t_1^{'}] [t1,t1]的一个关于边的ranked list L
    评估的方式:先计算得到 [ t 1 , t 1 ′ ] [t_1, t_1^{'}] [t1,t1]内真实出现的边的数量,记为 n = ∣ E n e w ∣ n=|E_{new}| n=Enew,然后从上面预测的列表中选出top n条边,然后计算预测的n个连接的准确率。
    准确率 = 预测的 t o p n 个连接中正确的数量 n 准确率 = \frac{预测的top\ n个连接中正确的数量}{n} 准确率=n预测的top n个连接中正确的数量

连接层面的特征

连接的特征可以分为三类:基于距离的特征、基于两节点局部邻域信息的特征、基于两节点全局领域信息的特征

两节点的最短路径长度

在这里插入图片描述

但仅考虑最短路径长度,会忽略连接的质量。如同样最短路径长度是2,A和B只有一条通路,而B和H有两条。

基于两节点局部邻域的信息

考虑两个节点v1和v2的邻接节点。

  • Common neighbors:
    思路:记录共同好友个数
    公式:
    ∣ N ( v 1 ) ∩ N ( v 2 ) ∣ \left|N\left(v_1\right) \cap N\left(v_2\right)\right| N(v1)N(v2)

  • Jaccard’s coefficient:
    思路:共同好友个数/两节点邻接节点的并集
    公式:
    ∣ N ( v 1 ) ∩ N ( v 2 ) ∣ ∣ N ( v 1 ) ∪ N ( v 2 ) ∣ \frac{\left|N\left(v_1\right) \cap N\left(v_2\right)\right|}{\left|N\left(v_1\right) \cup N\left(v_2\right)\right|} N(v1)N(v2)N(v1)N(v2)

  • Adamic-Adar index:
    思路:共同好友是不是社牛,如果v1和v2的共同好友是社牛,那么v1和v2的联系就很廉价。
    公式:
    ∑ u ∈ N ( v 1 ) ∩ N ( v 2 ) 1 log ⁡ ( k u ) \sum_{u \in N\left(v_1\right) \cap N\left(v_2\right)} \frac{1}{\log \left(k_u\right)} uN(v1)N(v2)log(ku)1

基于两节点的局部邻域信息的特征的缺点是:对于没有共同好友的两节点,他们的上述度量都是0。
但事实上,他们在未来可能会有连接。
而全局领域的信息度量可以解决这个缺陷。

基于两节点全局领域的信息

Katz index:
思路:计数节点u和v之间所有长度路径的加权和

可以使用图邻接矩阵的幂可以结算长度为k的路径个数
结合下图,利用数学归纳法,可以推导出 A u v l A_{u v}^l Auvl表示节点u和v之间长度为l的路径个数。
在这里插入图片描述

公式:
S v 1 v 2 = ∑ l = 1 ∞ β l A v 1 v 2 l S_{v_1 v_2}=\sum_{l=1}^{\infty} \beta^{l} A_{v_1 v_2}^l Sv1v2=l=1βlAv1v2l

其中, 0 < β < 1 0<\beta<1 0<β<1表示折减系数
它的等价矩阵形式是(类比等比数列求和,并求无穷级数可得):
( I − β A ) − 1 − I (\boldsymbol{I}-\beta \boldsymbol{A})^{-1}-\boldsymbol{I} (IβA)1I
一般可以将最大特征值的倒数作为折减系数 β \beta β

传统图机器学习的特征工程-全图

目标:将全图 G G G的结构特点表示为一个d维特征向量 ϕ ( G ) \phi(G) ϕ(G)
在这里插入图片描述

Bag-of-*

思路:类比NLP中的Bag-of-Words,

Bag-of-nodes.

在这里插入图片描述

Bag-of-node degrees

在这里插入图片描述

Bag-of-graphlets

注意,这里是从全图的视角去分析,所以这里的graphlets和前面在节点特征工程中提到的graphlets有两点不同:
可以存在孤立节点的graphlets
graphlets不区分根,如下图,g2对应一个graphlets,而不是两个(如果考虑根,是两个)

在这里插入图片描述
Graphlet Count Vector:给定一个图G,和graphlets列表 G k = ( g 1 , g 2 , . . . g n k ) G_k=(g_1,g_2, ... g_{n_k}) Gk=(g1,g2,...gnk),Graphlet Count Vector可以定义为(向量的第i个分量可以定义为第i个graphlet在全图中的个数):
( f G ) i = # ( g i ⊆ G ) for  i = 1 , 2 , … , n k \left(f_G\right)_i=\#\left(g_i \subseteq G\right) \text { for } i=1,2, \ldots, n_k (fG)i=#(giG) for i=1,2,,nk
例子:
在这里插入图片描述
给定两个图, G G G G ′ G' G,且有了它们对应的GCV,进一步,可以计算Graphlet Kernel:
K ( G , G ′ ) = f G T f G ′ K\left(G, G^{\prime}\right)=\boldsymbol{f}_G^{\mathrm{T}} \boldsymbol{f}_{G^{\prime}} K(G,G)=fGTfG
它可以反应这两张图的关系。

如果两个GCV的数量级悬殊,那么则需要先对这两个特征向量作归一化: h G = f G Sum ⁡ ( f G ) \boldsymbol{h}_G=\frac{\boldsymbol{f}_G}{\operatorname{Sum}\left(\boldsymbol{f}_G\right)} hG=Sum(fG)fG,再计算Graphlet Kernel: K ( G , G ′ ) = h G T h G ′ K\left(G, G^{\prime}\right)=\boldsymbol{h}_G{ }^{\mathrm{T}} \boldsymbol{h}_{G^{\prime}} K(G,G)=hGThG
获取GCV在算力上是很昂贵的,在大小为n的图上对大小为k的graphlet作子图匹配,需要的时间复杂度是多项式复杂度: O ( n k ) O(n^k) O(nk)
即使图节点的度被限制为 d d d,复杂度也仍有 O ( n d k − 1 ) O(nd^{k-1}) O(ndk1)

Weisfeiler-Lehman Kernel

由于Graphlets Kernel不够高效,下面引入更高效的Weisfeiler-Lehman Kernel。
目标:设计一个更高效的特征编码。
思路:使用邻域结构迭代式地丰富节点词库
算法实现:颜色微调
主要的步骤是:

  • 1.初始化颜色
  • 2.聚合邻域的颜色+对聚合后的颜色进行哈希映射:
    c ( k + 1 ) ( v ) = HASH ⁡ ( { c ( k ) ( v ) , { c ( k ) ( u ) } u ∈ N ( v ) } ) c^{(k+1)}(v)=\operatorname{HASH}\left(\left\{c^{(k)}(v),\left\{c^{(k)}(u)\right\}_{u \in N(v)}\right\}\right) c(k+1)(v)=HASH({c(k)(v),{c(k)(u)}uN(v)})
    在这里插入图片描述

    哈希表由两张图共同贡献

  • 3.重复执行k次2的操作,获得 c ( K ) ( v ) c^{(K)}(v) c(K)(v),根据所有出现过的颜色,统计次数,得到 ϕ ( G ) \phi(G) ϕ(G)
    在这里插入图片描述

    c ( K ) ( v ) c^{(K)}(v) c(K)(v)中包含了K跳邻域的信息。

  • 4.计算WL Kernel: ϕ ( G ) T ϕ ( G ) \phi(G)^T\phi(G) ϕ(G)Tϕ(G)

总体而言,WL Kernel的时间复杂度是O(#(edges))。

kernel methods

核方法是传统技巧学习在图层面的预测的常用方法。它的核心是如何设计Kernel而非特征向量。

Kernel K ( G , G ′ ) K(G, G') K(G,G)是标量,描述了数据间的相似度
核矩阵 K = ( K ( G , G ′ ) ) G , G ′ \boldsymbol{K}=\left(K\left(G, G^{\prime}\right)\right)_{G, G^{\prime}} K=(K(G,G))G,G永远半正定,即有正的特征值。
存在特征表示 ϕ ( ⋅ ) \phi(\cdot) ϕ()使得 K ( G , G ′ ) = ϕ ( G ) T ϕ ( G ′ ) K\left(G, G^{\prime}\right)=\phi(G)^{\mathrm{T}} \phi\left(G^{\prime}\right) K(G,G)=ϕ(G)Tϕ(G)
一定kernel确定了,现成的机器学习模型,如Kernel SVM就可以用来预测。

Node Embeddings-图嵌入表示学习

图表示学习减轻了做特征工程的工作。
映射得到的向量具有低维(向量维度远小于节点数)、连续(每个元素都是实数)、稠密(每个元素都不为0)的特点。

图嵌入-基本框架:编码器-解码器

假设:G是图,V是节点集,A是无权图,本节仍仅考虑连接信息,不考虑节点信息。
目标是:节点编码后,两节点在嵌入空间中的向量的(余弦)相似度可以反应(近似)两节点在图中的相似度。即
s i m i l a r i t y ( u , v ) ≈ z v T z u similarity(u,v)\approx \mathbf{z}_v^{\mathrm{T}} \mathbf{z}_u similarity(u,v)zvTzu
在这里插入图片描述
关键:如何定义节点的相似度。
步骤:

  • 编码器:节点-》d维向量
  • 定义节点在图中的相似度函数: s i m i l a r i t y ( u , v ) similarity(u,v) similarity(u,v)
  • 解码器:计算两个节点向量的相似度:如 z v T z u \mathbf{z}_v^{\mathrm{T}} \mathbf{z}_u zvTzu
  • 迭代优化编码器的参数使得图中相似节点的向量数量积大,不相似节点向量数量积小: s i m i l a r i t y ( u , v ) ≈ z v T z u similarity(u,v)\approx \mathbf{z}_v^{\mathrm{T}} \mathbf{z}_u similarity(u,v)zvTzu

node embeddings方法是无监督/自监督的,且与下游任务无关。

浅编码器

最简单的编码器-查表
只需要直接优化Z矩阵
对应方法有:DeepWalk,node2vec
在这里插入图片描述

基于随机游走的方法

图机器学习的很多概念可以类比NLP的很多概念
在这里插入图片描述
[暂时跳过这里去看DeepWalk论文精读]

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

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

相关文章

Mysql 性能分析(慢日志、profiling、explain)、读写分离(主从架构)、分库分表(垂直分库、垂直分表、水平分表)

查看系统性能参数 一条sql查询语句在执行前&#xff0c;需要确定查询执行计划&#xff0c;如果存在多种执行计划的话&#xff0c;mysql会计算每个执行计划所需要的成本&#xff0c;从中选择 成本最小的一个作为最终执行的执行计划 想要查看某条sql语句的查询成本&#xff0c;可…

SpringMVC框架@RequestMapping用法,处理器方法参数接收,处理器方法返回值详解

1. RequestMapping 定义请求规则 1.1 指定模块名称 通过RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方 法上&#xff0c;也可以注解在类上&#xff0c;但意义是不同的。value 属性值常以“/”开始。RequestMapping 的 value 属性用于定义所匹配请…

大数据下的精准营销获客

2012年以后&#xff0c;大数据&#xff08;big data&#xff09;一词越来越多地被提及&#xff0c;人们用它来描述和定义信息爆炸时代产生的海量数据&#xff0c;并命名与之相关的技术发展与创新。哈佛大学社会学教授加里金说“这是一场革命&#xff0c;庞大的数据资源使得各个…

【面试经典150 | 数组】合并两个有序数组

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;合并排序方法二&#xff1a;双指针方法三&#xff1a;原地操作-从前往后方法四&#xff1a;原地操作-从后往前 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章…

OpenCV(十八):图像直方图

目录 1.直方图统计 2.直方图均衡化 3.直方图匹配 1.直方图统计 直方图统计是一种用于分析图像或数据的统计方法&#xff0c;它通过统计每个数值或像素值的频率分布来了解数据的分布情况。 在OpenCV中&#xff0c;可以使用函数cv::calcHist()来计算图像的直方图。 calcHist(…

基于SSM的蜀都天香酒楼管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Tomcat服务部署及优化】

Tomcat 一、什么是Tomcat?二、Tomcat 核心组件2.1 Tomcat 组件2.3 Container组件的结构2.4 Tomcat 请求过程 三、Tomcat 部署3.1 安装JDK3.2 设置JDK环境变量3.3 安装Tomcat并用supervisor启动解压添加到supervisord服务测试能否通过supervisorctl启动 四、Tomcat的端口和主要…

Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。

1.场景 我们在调用接口时&#xff0c;很多时候会同时调用多个接口&#xff0c;接口都是异步执行&#xff0c;我们很难知道调用的多个接口哪个会最后执行完成&#xff0c;我们有时候需要对最后一个接口执行完成的时机监听&#xff0c;所以基于该需求&#xff0c;设计了CombineE…

RabbitMQ: 死信队列

一、在客户端创建方式 1.创建死信交换机 2.创建类生产者队列 3.创建死信队列 其实就是一个普通的队列&#xff0c;绑定号私信交换机&#xff0c;不给ttl&#xff0c;给上匹配的路由&#xff0c;等待交换机发送消息。 二、springboot实现创建类生产者队列 1.在消费者里的…

如何选择报修管理系统?报修工单管理系统有哪些功能和优势?

报修管理系统是一种能够帮助企业快速反应设备故障和异常情况&#xff0c;并将问题及时通知到相关人员&#xff0c;并对问题进行统计和分析的系统。它能够有效提高企业的工作效率&#xff0c;并减少人员成本的支出。那么,报修工单管理系统有哪些功能和优势呢&#xff1f;下面以“…

nginx-缓存

disk cache&#xff1a;磁盘缓存数据&#xff0c;有时间延迟&#xff0c;但是非常小&#xff0c;相对于直接请求服务器返回 对于用户来说基本无感知。 memory cache&#xff1a;磁盘缓存数据&#xff0c;基本上没有时间延迟 协商缓存&#xff08;nginx自带功能&#xff0c; 不…

C++函数内联详解

本文旨在讲解C中的函数内联相关知识&#xff0c;读完这篇文章&#xff0c;希望读者们会对函数内联有更深一步的认识&#xff01; 内联函数的定义 在计算机科学中&#xff0c; 内联函数 &#xff08;有时称作 在线函数 或 编译时期展开函数 &#xff09;是一种编程语言结构&…

详解Vue中的render: h => h(App)

声明:只是记录&#xff0c;会有错误&#xff0c;谨慎阅读 我们用脚手架初始化工程的时候&#xff0c;main.js的代码如下 import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({// 把app组件放入容器中render: h > h(App), }).$mount(#ap…

洛谷P8814:解密 ← CSP-J 2022 复赛第2题

【题目来源】https://www.luogu.com.cn/problem/P8814https://www.acwing.com/problem/content/4732/【题目描述】 给定一个正整数 k&#xff0c;有 k 次询问&#xff0c;每次给定三个正整数 ni&#xff0c;ei&#xff0c;di&#xff0c;求两个正整数 pi&#xff0c;qi&#xf…

vue中的几种name属性

vue中的几种name属性 组件名name name选项 export default{name:xxx } // 获取组件的name属性 this.$options.namevue-devtools调试工具里显示的组件名称&#xff1b; 未配置name选项&#xff0c;就是组件的文件名&#xff1b; vue3配置name通过defineOptions()函数 de…

flink cdc多种数据源安装、配置与验证

搜索 flink cdc多种数据源安装、配置与验证 文章目录 1. 前言2. 数据源安装与配置2.1 MySQL2.1.1 安装2.1.2 CDC 配置2.2 Postgresql2.2.1 安装2.2.2 CDC 配置2.3 Oracle2.3.1 安装2.3.2 CDC 配置2.4 SQLServer2.4.1 安装2.4.2 CDC 配置3. 验证3.1 Flink版本与CDC版本的对应关系…

nlp系列(7)实体识别(Bert)pytorch

模型介绍 本项目是使用Bert模型来进行文本的实体识别。 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&#xff08;Bert&#xff09;pytorch_bert文本分类_牧子川的博客-CSDN博客 模型结构 Bert模型的模型结构&#xff1a; 数据介绍 …

MySQL——常见问题

NULL和空值的区别 1、空值不占空间&#xff0c;NULL值占空间。当字段不为NULL时&#xff0c;也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0c;只能查出字段中没有不为NULL的或者为 NULL 的&#xff0c;不能查出空值。 3、判断NULL 用IS NULL 或者 is no…

46、TCP的“三次握手”

在上一节中&#xff0c;TCP首部常用的几个选项&#xff0c;有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后&#xff0c;下面我们开始学习TCP的连接建立。 TCP的一个特点是提供可靠的传输机制&#xff0c;还有一个特点就是TCP…

排序(408)

一、插入排序&#xff08;直接、折半、希尔&#xff09; 【2009统考】若数据元素序列{11,12,13,7,8,9,23,4,5}是采用下列排序方法之一得到的第二趟排序后的结果&#xff0c;则该排序算法只能是&#xff08;B&#xff09; A、冒泡排序 B、插入排序 C、选择排序 …