图神经网络拉普拉斯矩阵理论

图拉普拉斯矩阵是谱图理论中的一个重要概念,它描述了一个图的结构特性,主要用于量化图的连通性和节点之间的关系。我们可以通过一个简单的无向图例子来说明图拉普拉斯矩阵是如何构造的。

### 例子:一个无向图

假设我们有一个无向图 \(G=(V,E)\),其中顶点集 \(V=\{v_1,v_2,v_3,v_4\}\) 和边集 \(E=\{(v_1,v_2),(v_1,v_3),(v_2,v_3),(v_3,v_4)\}\)。这意味着图中有四个节点,且存在四条边,分别连接节点1和2、节点1和3、节点2和3以及节点3和4。

### 构造邻接矩阵 \(A\)

首先,我们需要构建邻接矩阵 \(A\)。对于无向图,邻接矩阵是一个对称矩阵,其中 \(A_{ij}=1\) 如果节点 \(i\) 和 \(j\) 之间有边,否则 \(A_{ij}=0\)。对于我们的例子:

\[
A =
\begin{bmatrix}
0 & 1 & 1 & 0 \\
1 & 0 & 1 & 0 \\
1 & 1 & 0 & 1 \\
0 & 0 & 1 & 0
\end{bmatrix}
\]

### 构造度矩阵 \(D\)

接下来,我们构建度矩阵 \(D\),这是一个对角矩阵,其中对角线上的元素 \(D_{ii}\) 是节点 \(i\) 的度数,也就是与节点 \(i\) 相连的边的数量。在这个例子中:

\[
D =
\begin{bmatrix}
2 & 0 & 0 & 0 \\
0 & 2 & 0 & 0 \\
0 & 0 & 3 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
\]

### 计算图拉普拉斯矩阵 \(L\)

现在,我们可以计算图拉普拉斯矩阵 \(L\),它定义为:

\[
L = D - A
\]

所以,

\[
L =
\begin{bmatrix}
2 & 0 & 0 & 0 \\
0 & 2 & 0 & 0 \\
0 & 0 & 3 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
-
\begin{bmatrix}
0 & 1 & 1 & 0 \\
1 & 0 & 1 & 0 \\
1 & 1 & 0 & 1 \\
0 & 0 & 1 & 0
\end{bmatrix}
=
\begin{bmatrix}
2 & -1 & -1 & 0 \\
-1 & 2 & -1 & 0 \\
-1 & -1 & 3 & -1 \\
0 & 0 & -1 & 1
\end{bmatrix}
\]

这就是我们图的未标准化的图拉普拉斯矩阵。它体现了图的连通性信息,每个节点的行和列的非对角线元素代表了与其它节点的连接强度(负值表示连接),而对角线元素则表示节点的度减去其与邻居的连接。

### 标准化图拉普拉斯矩阵

此外,我们还可以定义标准化的图拉普拉斯矩阵 \(L_{sym}\) 和 \(L_{rw}\),它们分别是:

\[
L_{sym} = I - D^{-\frac{1}{2}}AD^{-\frac{1}{2}}
\]

\[
L_{rw} = D^{-1}L = I - D^{-1}A
\]

标准化的矩阵通常在图卷积网络中使用,因为它们考虑了图的大小和形状,使模型能够更好地处理不同尺度的图。

通过这个例子,你可以看到图拉普拉斯矩阵是如何从图的邻接和度矩阵中衍生出来的,以及它如何反映图的结构特性。

图卷积网络(GCN)的核心公式体现了图拉普拉斯矩阵的作用,尤其是在特征传播和聚合的过程中。原始的GCN模型由Thomas N. Kipf和Max Welling在他们的论文《Semi-Supervised Classification with Graph Convolutional Networks》中提出。核心公式如下:

\[
H^{(l+1)} = \sigma(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l)})
\]

这里:
- \(H^{(l)}\) 是第 \(l\) 层的节点特征矩阵,
- \(W^{(l)}\) 是第 \(l\) 层的权重矩阵,
- \(\sigma\) 是非线性激活函数,
- \(\tilde{A}\) 是经过自连接处理的邻接矩阵,
- \(\tilde{D}\) 是根据 \(\tilde{A}\) 构建的度矩阵,
- \(H^{(l+1)}\) 是经过卷积操作后第 \(l+1\) 层的节点特征矩阵。

在这个公式中,\(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}\) 实际上是一个归一化版本的图拉普拉斯矩阵,或者更准确地说,是归一化的邻接矩阵。在原始的GCN论文中,为了简化计算和提高模型的性能,作者提出了一个近似版本的图拉普拉斯矩阵,它包含了自连接(self-loops)并且进行了归一化处理。

具体来说,原始的图拉普拉斯矩阵定义为 \(L = D - A\),其中 \(D\) 是度矩阵,\(A\) 是邻接矩阵。但在GCN中,为了使模型更容易收敛,作者使用了归一化后的邻接矩阵 \(\tilde{A}\),定义为:

\[
\tilde{A} = A + I
\]

其中 \(I\) 是单位矩阵,加入单位矩阵相当于为每个节点添加了自连接。然后,构建对应的度矩阵 \(\tilde{D}\),其中 \(\tilde{D}_{ii} = \sum_j \tilde{A}_{ij}\)。接着,使用 \(\tilde{D}\) 和 \(\tilde{A}\) 来构建归一化矩阵:

\[
\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}
\]

这个归一化矩阵的作用在于,它确保了每个节点在聚合邻居信息时,每个邻居的贡献是平等的,而不是由节点的度数所决定。换句话说,即使一个节点有很多邻居,它也不会在聚合阶段过分影响结果。这个矩阵在公式中的乘法操作,实现了节点特征在图结构上的传播和聚合,同时也体现了图拉普拉斯矩阵在保持图结构信息的同时,进行特征平滑和滤波的功能。

因此,通过这个核心公式,图拉普拉斯矩阵(或者其近似版本)的作用在于促进节点特征在图结构上的有效传播和聚合,同时保持图的结构信息。


当然,让我们通过一个具体的例子来理解度矩阵的构造过程。

### 例子

假设我们有一个无向图,包含4个节点,其边集和邻接矩阵如下所示:

- 节点集 \(V = \{v_1, v_2, v_3, v_4\}\)
- 边集 \(E = \{(v_1, v_2), (v_1, v_3), (v_2, v_3), (v_3, v_4)\}\)

根据边集,我们可以构建邻接矩阵 \(A\):

\[
A =
\begin{bmatrix}
0 & 1 & 1 & 0 \\
1 & 0 & 1 & 0 \\
1 & 1 & 0 & 1 \\
0 & 0 & 1 & 0
\end{bmatrix}
\]

这里的 \(A_{ij} = 1\) 表示节点 \(i\) 和节点 \(j\) 之间有一条边,\(A_{ij} = 0\) 表示没有直接连接。

### 构造度矩阵 \(D\)

度矩阵 \(D\) 是一个对角矩阵,其中对角线上的每个元素 \(D_{ii}\) 等于节点 \(i\) 的度数,即与节点 \(i\) 相连的边的数量。我们可以通过对邻接矩阵 \(A\) 的每一行求和来得到每个节点的度数,然后将这些度数放在一个对角矩阵的对角线上。

对于节点 \(v_1\),它的度数是 2(因为它与 \(v_2\) 和 \(v_3\) 相连),对于节点 \(v_2\),度数也是 2,对于 \(v_3\),度数是 3,而对于 \(v_4\),度数是 1。

因此,度矩阵 \(D\) 如下所示:

\[
D =
\begin{bmatrix}
2 & 0 & 0 & 0 \\
0 & 2 & 0 & 0 \\
0 & 0 & 3 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
\]

### 度矩阵的构造公式

度矩阵 \(D\) 的构造公式可以写为:

\[
D_{ii} = \sum_j A_{ij}
\]

对于每个节点 \(i\),我们遍历邻接矩阵 \(A\) 的第 \(i\) 行,将所有非对角线元素相加,得到的结果就是节点 \(i\) 的度数,即 \(D_{ii}\) 的值。

### 总结

度矩阵 \(D\) 的构建过程体现了每个节点在图中的连通程度,它是后续计算图拉普拉斯矩阵、归一化矩阵以及在图卷积网络(GCN)中进行特征传播的基础。通过这个例子,我们可以清晰地看到度矩阵的构造过程和它在图论及图神经网络中的重要作用。

图拉普拉斯算子,也称为图拉普拉斯矩阵或离散拉普拉斯算子,是谱图理论中的一个核心概念。它在图信号处理、机器学习、尤其是图神经网络(GNN)和图卷积网络(GCN)等领域有着广泛的应用。图拉普拉斯算子的作用在于量化图结构中的不规则性和平滑性,从而允许在图上进行类似传统信号处理中的滤波和卷积操作。

图拉普拉斯矩阵的定义基于图的邻接矩阵和度矩阵。给定一个无向图 \(G=(V,E)\),其中 \(V\) 是顶点集合,\(E\) 是边集合,我们可以定义以下两个矩阵:

1. **邻接矩阵 \(A\)**
   - \(A\) 是一个 \(|V| \times |V|\) 的矩阵,其中 \(A_{ij} = 1\) 如果顶点 \(i\) 和 \(j\) 之间存在一条边,否则 \(A_{ij} = 0\)。对于带权图,\(A_{ij}\) 可以是边的权重。

2. **度矩阵 \(D\)**
   - \(D\) 也是一个 \(|V| \times |V|\) 的对角矩阵,其中对角线上的元素 \(D_{ii}\) 是顶点 \(i\) 的度(即与顶点 \(i\) 相邻的边的数量)。对于带权图,度可以是边权重的总和。

图拉普拉斯矩阵 \(L\) 可以按照以下几种方式定义:

1. **未标准化的图拉普拉斯矩阵**
   \[
   L = D - A
   \]
   这是图拉普拉斯矩阵最简单的形式,它反映了顶点间边的存在与否。

2. **标准化的图拉普拉斯矩阵**
   \[
   L_{sym} = I - D^{-\frac{1}{2}}AD^{-\frac{1}{2}}
   \]
   或者
   \[
   L_{rw} = D^{-1}L = I - D^{-1}A
   \]
   其中 \(I\) 是单位矩阵,\(D^{-\frac{1}{2}}\) 是度矩阵 \(D\) 的对角元素开平方根后的逆矩阵。标准化的图拉普拉斯矩阵考虑了图的大小和形状,使得不同规模的图可以比较。

图拉普拉斯矩阵的谱(特征值和特征向量)可以提供有关图的结构信息,例如图的连通性、环路和团等。在图信号处理中,图拉普拉斯矩阵的谱可以被用来定义图傅里叶变换,类似于经典信号处理中的连续傅里叶变换。

在机器学习中,图拉普拉斯矩阵用于图卷积网络(GCN),其中它扮演着类似于卷积操作的角色,但适用于非欧几里得的图结构数据。GCN 利用图拉普拉斯矩阵来聚合节点及其邻居的信息,从而生成节点的嵌入表示。

现在我们已经完成了消息传递、聚合和更新步骤,让我们把它们放在一起,在单个节点i上形成单个GNN层:GCN所有节点更新后为什么还要再做一次聚合变换


您提供的公式(9)是一个图卷积神经网络(GCN)的典型表示。在GCN中,每个节点通过其邻居的信息进行更新,并且这个过程通常会迭代多次。

在完成一轮消息传递、聚合和更新之后,节点的状态会发生变化。然而,由于图中的信息是相互关联的,因此一个节点的状态改变可能会影响其他相邻节点的状态。为了捕捉这种影响并进一步提取有用的信息,通常会在一轮更新后再次执行聚合操作。

这样做的原因有以下几点:

1. **捕获更深层次的关系**:通过多轮迭代,GCN可以捕获到更高层次的节点间关系,这有助于学习更复杂的图结构。
2. **平滑邻近节点之间的特征**:每次迭代都会使相邻节点的特征更加相似,从而减少噪声的影响并提高模型的鲁棒性。
3. **增强表达能力**:通过多次迭代,GC


在图神经网络(GNN)中使用邻接矩阵进行正向传递的过程涉及到节点特征的更新,这个过程可以通过矩阵运算来实现。下面是这个过程的详细解释:

1. **节点特征向量**:每个节点 \( i \) 有一个特征向量 \( \mathbf{x}_i \in \mathbb{R}^d \),其中 \( d \) 是特征的维度。

2. **参数矩阵**:有一个可学习的参数矩阵 \( \mathbf{W} \in \mathbb{R}^{d' \times d} \),其中 \( d' \) 是嵌入的维度。

3. **点积**:在多层感知器(MLP)前向传递中,我们希望对特征向量 \( \mathbf{x}_i \) 中的项目进行加权。这可以通过 \( \mathbf{x}_i \) 和 \( \mathbf{W} \) 的点积来实现,即 \( \mathbf{z}_i = \mathbf{W} \mathbf{x}_i \)。

4. **邻接矩阵**:邻接矩阵 \( \mathbf{A} \) 表示图中节点之间的连接关系。如果节点 \( i \) 和 \( j \) 之间有边,则 \( A_{ij} = 1 \),否则 \( A_{ij} = 0 \)。在实际应用中,邻接矩阵可能需要加上单位矩阵 \( \mathbf{I} \) 来表示自环,即 \( \tilde{\mathbf{A}} = \mathbf{A} + \mathbf{I} \)。

5. **消息聚合**:在GNN中,每个节点 \( i \) 会收集其邻居节点的特征,然后进行聚合。这可以通过邻接矩阵与转换后的节点特征矩阵的乘法来实现。如果 \( \mathbf{Z} = \mathbf{X} \mathbf{W} \) 是加权后的节点特征矩阵,那么聚合后的消息 \( \mathbf{M}_i \) 可以表示为 \( \mathbf{M}_i = \sum_{j \in \mathcal{N}_i} \mathbf{z}_j \),其中 \( \mathcal{N}_i \) 是节点 \( i \) 的邻居集合。使用矩阵运算,这可以表示为 \( \mathbf{M} = \tilde{\mathbf{A}} \mathbf{Z} \)。

6. **更新节点特征**:最后,节点 \( i \) 的新特征 \( \mathbf{h}_i \) 可以通过将聚合的消息 \( \mathbf{M}_i \) 与原始特征 \( \mathbf{x}_i \) 结合来计算,例如通过加权求和或非线性变换。

整个过程可以用以下公式概括:
\[ \mathbf{h}_i = f(\mathbf{x}_i, \mathbf{M}_i) \]
其中 \( f \) 是一个函数,可以是简单的加法、连接或其他非线性变换。

这个矩阵运算的过程允许我们高效地在所有节点上并行地执行GNN的正向传递。


矩阵乘法是一种将两个矩阵对应元素相乘然后求和的操作。在图神经网络(GNN)的上下文中,邻接矩阵 \(\mathbf{A}\) 通常表示图的拓扑结构,而矩阵 \(\mathbf{Z}\) 表示节点的特征。当我们执行 \(\mathbf{A}\) 和 \(\mathbf{Z}\) 的乘法时,我们实际上是在执行一个消息聚合的过程,其中每个节点根据其邻居的特征更新自己的状态。

假设我们有以下简化的矩阵:

- 邻接矩阵 \(\mathbf{A}\) 是一个 \(N \times N\) 的矩阵,其中 \(N\) 是图中节点的数量。这里我们假设 \(N=3\),邻接矩阵如下:
  \[ \mathbf{A} = \begin{bmatrix}
  0 & 1 & 0 \\
  1 & 0 & 1 \\
  0 & 1 & 0
  \end{bmatrix} \]
  这里,\(A_{21} = 1\) 表示节点 2 和节点 1 之间有一条边,其他类似。

- 节点特征矩阵 \(\mathbf{Z}\) 是一个 \(N \times d\) 的矩阵,其中 \(d\) 是每个节点的特征维度。假设 \(d=2\),矩阵如下:
  \[ \mathbf{Z} = \begin{bmatrix}
  z_{11} & z_{12} \\
  z_{21} & z_{22} \\
  z_{31} & z_{32}
  \end{bmatrix} \]
  这里,\(z_{ij}\) 表示节点 \(i\) 的第 \(j\) 个特征。

当我们计算 \(\mathbf{A}\) 和 \(\mathbf{Z}\) 的乘积 \(\mathbf{M} = \mathbf{A} \mathbf{Z}\) 时,我们实际上是在计算每个节点基于其邻居特征的聚合信息。计算过程如下:

- 计算 \(\mathbf{M}\) 的第一行:
  \[ \mathbf{m}_1 = \mathbf{A} \text{ 的第一行} \times \mathbf{Z} \]
  \[ \mathbf{m}_1 = \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} \times \begin{bmatrix}
  z_{11} & z_{12} \\
  z_{21} & z_{22} \\
  z_{31} & z_{32}
  \end{bmatrix} = \begin{bmatrix}
  0 \cdot z_{11} + 0 \cdot z_{21} + 0 \cdot z_{31} & 0 \cdot z_{12} + 0 \cdot z_{22} + 0 \cdot z_{32}
  \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} \]

- 计算 \(\mathbf{M}\) 的第二行(这就是你提到的“比如说A的第二行”):
  \[ \mathbf{m}_2 = \mathbf{A} \text{ 的第二行} \times \mathbf{Z} \]
  \[ \mathbf{m}_2 = \begin{bmatrix} 1 \\ 0 \\ 1 \end{bmatrix} \times \begin{bmatrix}
  z_{11} & z_{12} \\
  z_{21} & z_{22} \\
  z_{31} & z_{32}
  \end{bmatrix} = \begin{bmatrix}
  1 \cdot z_{11} + 0 \cdot z_{21} + 1 \cdot z_{31} & 1 \cdot z_{12} + 0 \cdot z_{22} + 1 \cdot z_{32}
  \end{bmatrix} = \begin{bmatrix}
  z_{11} + z_{31} \\ z_{12} + z_{32}
  \end{bmatrix} \]

- 以此类推,我们可以计算 \(\mathbf{M}\) 的第三行。

最终,矩阵 \(\mathbf{M}\) 将包含每个节点基于其邻居特征的聚合信息。在这个例子中,\(\mathbf{m}_2\) 表示节点 2 从节点 1 和节点 3 那里聚合的特征信息。这种聚合可以用于节点的更新,是图神经网络中的一个关键步骤。

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

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

相关文章

VTK- 面绘制体绘制

在VTK中,面绘制(Surface Rendering)和体绘制(Volume Rendering)是两种常见的三维数据可视化方法。面绘制和体绘制是计算机图形学中用于三维数据可视化的重要技术,尤其在医学成像、科学可视化和计算机辅助设…

agx orin

Ubuntu20安装ROS2 foxy-CSDN博客 Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大_ubuntu国内源地址-CSDN博客ubuntu-ports镜像_ubuntu-ports下载地址_ubuntu-port…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX,子网 掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…

oh-my-zsh启动慢重新安装

在Mac上安装oh-my-zsh并设置主题实际上是一个两步过程:首先安装oh-my-zsh,然后配置你喜欢的主题。oh-my-zsh本身并不直接“安装主题”,而是提供了一个框架,让你能够轻松地更改和配置主题。主题通常是oh-my-zsh框架的一部分&#x…

平滑滚动到页面顶部?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿! 大家好,我是大澈! 本文约 700 字,整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段,通过简单的逻辑…

游戏行业情报 | 手机玩3A终是空想?iOS版3A大作销量滑铁卢

2023年9月的苹果发布会上,苹果宣布iPhone15 Pro系列首发配备的A17 Pro芯片将能够支持3A游戏的游玩,随着该系列设备的发布,《生化危机 4》、《生化危机:村庄》、《死亡搁浅》和《刺客信条:幻景》等大作先后登陆iOS平台。…

Qt 使用 QZipReader 解压文件

Qt 使用 QZipReader 解压文件 文章目录 Qt 使用 QZipReader 解压文件摘要关于 QZipReader使用 QZipReader代码解释: 快速解 extractAll 关键字: Qt、 QZipReader、 extractAll、 Zip、 解压缩 摘要 每日一坑,坑坑难过,今日在…

2024年度 | 推荐PC端时间规划、项目管理软件(最新)

PingCode:适用于IT团队的项目/任务管理。 https://pingcode.com/ Worktile:团队通用的任务规划工具。 https://worktile.com/ Todoist:个人任务管理工具,支持跨平台同步。 Todoist | 管理您工作和生活的To Do List Pomodoro Ti…

网卡配置文件详解

详解 [rootCSDN_xiaodu ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPEEthernet # 网络类型 以太网 BOOTPROTOnone # IP地址的配置方式# none 手动配置# static 手动配置# dhcp 自动获取(不使用) NAMEeth0 # 网卡在系统中的名称 UU…

[JS]面向对象ES6

class类 ES6是基于 class关键字 创建类 <script>// 1.定义类class Person {// 公有属性name// 公有属性 (设置默认值)age 18// 构造函数constructor(name) {// 构造函数的this指向实例化对象// 构造函数的作用就是给实例对象设置属性this.name name// 动态添加属性(不…

Android选择题界面的设计——线性布局实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button、CheckBox等实现一个选择题界面&#xff0c;界面如图1所示。 图1 选择题界面效果图 任务分析 上述界面可以分解为上下两部分&#xff0c;上面部分可以使用横向的线性布局来完成&#xff0c;下面部分可以使用…

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势 随着全球互联网的迅猛发展和移动互联网的普及&#xff0c;广告投放已经成为企业扩大品牌影响力、获取潜在客户的重要手段之一。在印尼这一充满活力的市场中&#xff0c;直播工具APP的广告投放尤为关键。海外快…

快速了解 | 企业代码签名证书怎么弄

企业代码签名证书是用于签名软件、驱动程序、代码库等的数字证书&#xff0c;它能够保证软件的完整性和来源的真实性&#xff0c;从而提升用户对软件的信任度&#xff0c;消除电脑系统对于“未知发布者”软件的安装拦截和弹窗警告&#xff0c;消除微软的SmartScreen提醒。 1、…

ArmPiPro-多人同时开发

V0.0 2024.07.04 ROS节点间的通信是分布式的&#xff0c;也就是节点可以运行在不同的”主机“上&#xff0c;这些主机包括安装在机器人上的主控&#xff08;Pi4&#xff09;、通过串口连接PI4的烧写有Serialros的MCU从控、负责视觉开发的VM1、负责移动的VM2、负责机械臂的VM3都…

【自适应滤波系列四】回声消除(Acoustic Echo Cancellation, AEC)信号模型及其本质

什么是回声 关于回声的产生与传播,凌逆战(https://www.cnblogs.com/LXP-Never)大佬在其博客中阐述得很详细,可以去看他的博客,下面部分图片来源于其博客 回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。一些回声是必要的,比如剧院里的音乐回声…

海豚调度监控:新增依赖缺失巡检,上游改动再也不用担心了!

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益:) 用过 DolphinScheduler 的小伙伴应该都知道&#xff0c;Dolphin…

代理IP和VPN有什么区别?该怎么选择?

今天我们来聊聊很多人关心的一个问题——代理IP和VPN到底有什么区别&#xff1f;虽然它们听起来差不多&#xff0c;但其实有很大的不同。这篇文章&#xff0c;小编就带大家一起了解一下吧&#xff01; 什么是代理IP&#xff1f; 代理IP是一种通过代理服务器替换用户真实IP地址…

第3章.中央服务器的物联网模式--AI/ML集成

第3章.中央服务器的物联网模式 本章列出了由于存储和/或计算需求而部署在中央服务器上以及部署在边缘&#xff08;本地&#xff09;或云上的体系结构模式。 这些模式基于现场设备生成的数据提供见解&#xff0c;使用附加数据&#xff08;来自附加系统&#xff0c;如企业系统&am…

【数据结构】建堆的时间复杂度

一.向下调整建堆 1.二叉树层数与总节点个数关系 层数一定时&#xff0c;在二叉树节点个数最大的情况下&#xff0c;二叉树为满二叉树&#xff0c;如下图所示&#xff0c;可以清晰地看到在满二叉树中第h层有2^(h-1)个节点&#xff0c;总节点N就等于一个等比数列的求和&#xf…

6.基于SpringBoot的SSMP整合案例-业务层开发

目录 1.业务层标准开发 1.1接口定义 1.2实现类定义 1.3测试类定义 1.4小结&#xff1a; 2.业务层快速开发 2.1使用MyBatisP1us提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl),t> 接口定义&#xff1a; 实现类定义&#xff1a; 测试类&#xff1a; …