文章目录
基本概念
归一化拉普拉斯矩阵是图谱论中的一种重要矩阵表示方法,主要用于处理图结构的数据。它基于原始的拉普拉斯矩阵进行变换
,旨在强调图的结构特性,并在图的谱分析、尤其是图卷积网络(GCNs)等机器学习应用中扮演关键角色。
归一化拉普拉斯矩阵主要有两种形式:对称归一化和随机游走归一化。
-
对称归一化拉普拉斯矩阵(Symmetrically Normalized Laplacian):
定义为 L s y m = D − 1 / 2 L D − 1 / 2 L_{sym} = D^{-1/2}LD^{-1/2} Lsym=D−1/2LD−1/2
其中 L 是未归一化的拉普拉斯矩阵, D 是度矩阵, D i i 等于节点 i 的度。 其中 L 是未归一化的拉普拉斯矩阵, D 是度矩阵, D_{ii} 等于节点 i 的度。 其中L是未归一化的拉普拉斯矩阵,D是度矩阵,Dii等于节点i的度。通过对 ( D ) 进行逆平方根操作并乘以前后,可以确保 L s y m L_{sym} Lsym保持对称
且具有更好的数值属性,特别是在谱分析和谱图分区中。这样的归一化保证了最小特征值为0(对应所有节点相同的常向量),并且最大特征值为2
,有利于谱聚类和谱图划分。 -
随机游走归一化拉普拉斯矩阵(Random Walk Normalized Laplacian):
定义为 L r w = D − 1 L L_{rw} = D^{-1}L Lrw=D−1L
这种归一化形式模拟了从图中的任意节
点出发进行随机游走的过程,通过除以节点的度
来确保从每个节点出发的概率总和为1
。这在某些场景下,如随机游走相关的算法和网络分析中更为适用。
归一化的好处包括:
- 改善数值稳定性:尤其是在图的邻接关系稀疏或度分布不均匀时,归一化可以
减少矩阵条件数
,提高算法的稳定性和收敛速度。
- 增强谱特性:使得谱分析更加明显和有用,比如特征值和特征向量能更好地反映图的连通性、社区结构等特性。
- 促进对比统一性:在多图比较或集成学习中,归一化有助于消除图大小或密度差异造成的影响,使得不同图之间的比较更加公平。
例子
计算对称归一化拉普拉斯矩阵
步骤 1: 计算度矩阵 D
已知邻接矩阵 ( A ) 如下:
A
=
[
0
1
1
1
0
1
1
1
0
]
A = \begin{bmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \end{bmatrix}
A=
011101110
对于无向图,节点的度是指与其相连的边的数量。可以通过对 ( A ) 的每一行求和得到每个节点的度数。因此,度矩阵 ( D ) 为对角矩阵
,其对角线元素为对应节点的度。
计算得到:
D
=
[
2
0
0
0
2
0
0
0
2
]
D = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 2 \end{bmatrix}
D=
200020002
步骤 2 : 计算 D 的逆平方根 D − 1 / 2 步骤 2: 计算 D 的逆平方根 D^{-1/2} 步骤2:计算D的逆平方根D−1/2
对角矩阵
D
的逆平方根
D
−
1
/
2
只需对每个对角元素取平方根后再取倒数。
对角矩阵 D 的逆平方根 D^{-1/2} 只需对每个对角元素取平方根后再取倒数。
对角矩阵D的逆平方根D−1/2只需对每个对角元素取平方根后再取倒数。
因此,对于每个度为
d
i
的节点,其对应的
D
−
1
/
2
中的元素为
1
/
d
i
。
因此,对于每个度为 d_i 的节点,其对应的 D^{-1/2} 中的元素为 1/\sqrt{d_i} 。
因此,对于每个度为di的节点,其对应的D−1/2中的元素为1/di。
计算得到:
D
−
1
/
2
=
[
1
/
2
0
0
0
1
/
2
0
0
0
1
/
2
]
D^{-1/2} = \begin{bmatrix} 1/\sqrt{2} & 0 & 0 \\ 0 & 1/\sqrt{2} & 0 \\ 0 & 0 & 1/\sqrt{2} \end{bmatrix}
D−1/2=
1/20001/20001/2
即:
D
−
1
/
2
=
[
0.7071
0
0
0
0.7071
0
0
0
0.7071
]
D^{-1/2} = \begin{bmatrix} 0.7071 & 0 & 0 \\ 0 & 0.7071 & 0 \\ 0 & 0 & 0.7071 \end{bmatrix}
D−1/2=
0.70710000.70710000.7071
步骤 3 : 计算 L s y m 步骤 3: 计算 L_{sym} 步骤3:计算Lsym
对称归一化拉普拉斯矩阵 L s y m 的公式为 L s y m = D − 1 / 2 L D − 1 / 2 ,其中 L = D − A 是未归一化的拉普拉斯矩阵。 对称归一化拉普拉斯矩阵 L_{sym} 的公式为 L_{sym} = D^{-1/2}LD^{-1/2} ,其中 L = D - A 是未归一化的拉普拉斯矩阵。 对称归一化拉普拉斯矩阵Lsym的公式为Lsym=D−1/2LD−1/2,其中L=D−A是未归一化的拉普拉斯矩阵。
首先计算 ( L ):
L
=
D
−
A
=
[
2
0
0
0
2
0
0
0
2
]
−
[
0
1
1
1
0
1
1
1
0
]
=
[
2
−
1
−
1
−
1
2
−
1
−
1
−
1
2
]
L = D - A = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 2 \end{bmatrix} - \begin{bmatrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \end{bmatrix} = \begin{bmatrix} 2 & -1 & -1 \\ -1 & 2 & -1 \\ -1 & -1 & 2 \end{bmatrix}
L=D−A=
200020002
−
011101110
=
2−1−1−12−1−1−12
然后,将
L
代入
L
s
y
m
的公式中计算:
然后,将 L 代入 L_{sym} 的公式中计算:
然后,将L代入Lsym的公式中计算:
L
s
y
m
=
D
−
1
/
2
L
D
−
1
/
2
=
[
0.7071
0
0
0
0.7071
0
0
0
0.7071
]
[
2
−
1
−
1
−
1
2
−
1
−
1
−
1
2
]
[
0.7071
0
0
0
0.7071
0
0
0
0.7071
]
L_{sym} = D^{-1/2}LD^{-1/2} = \begin{bmatrix} 0.7071 & 0 & 0 \\ 0 & 0.7071 & 0 \\ 0 & 0 & 0.7071 \end{bmatrix} \begin{bmatrix} 2 & -1 & -1 \\ -1 & 2 & -1 \\ -1 & -1 & 2 \end{bmatrix} \begin{bmatrix} 0.7071 & 0 & 0 \\ 0 & 0.7071 & 0 \\ 0 & 0 & 0.7071 \end{bmatrix}
Lsym=D−1/2LD−1/2=
0.70710000.70710000.7071
2−1−1−12−1−1−12
0.70710000.70710000.7071
进行矩阵乘法运算:
L
s
y
m
=
[
1.4142
−
0.7071
−
0.7071
−
0.7071
1.4142
−
0.7071
−
0.7071
−
0.7071
1.4142
]
[
0.7071
0
0
0
0.7071
0
0
0
0.7071
]
=
[
1
−
1
−
1
−
1
1
−
1
−
1
−
1
1
]
L_{sym} = \begin{bmatrix} 1.4142 & -0.7071 & -0.7071 \\ -0.7071 & 1.4142 & -0.7071 \\ -0.7071 & -0.7071 & 1.4142 \end{bmatrix} \begin{bmatrix} 0.7071 & 0 & 0 \\ 0 & 0.7071 & 0 \\ 0 & 0 & 0.7071 \end{bmatrix} = \begin{bmatrix} 1 & -1 & -1 \\ -1 & 1 & -1 \\ -1 & -1 & 1 \end{bmatrix}
Lsym=
1.4142−0.7071−0.7071−0.70711.4142−0.7071−0.7071−0.70711.4142
0.70710000.70710000.7071
=
1−1−1−11−1−1−11
最终得到的对称归一化拉普拉斯矩阵
L
s
y
m
为:
最终得到的对称归一化拉普拉斯矩阵 L_{sym} 为:
最终得到的对称归一化拉普拉斯矩阵Lsym为:
L
s
y
m
=
[
1
−
1
−
1
−
1
1
−
1
−
1
−
1
1
]
L_{sym} = \begin{bmatrix} 1 & -1 & -1 \\ -1 & 1 & -1 \\ -1 & -1 & 1 \end{bmatrix}
Lsym=
1−1−1−11−1−1−11
Python代码实现:
import numpy as np
# 定义邻接矩阵A
A = np.array([[0, 1, 1],
[1, 0, 1],
[1, 1, 0]])
# 计算度矩阵D
D = np.diag(np.sum(A, axis=1))
# 计算D的逆平方根
D_inv_sqrt = np.diag(1 / np.sqrt(D.diagonal()))
# 计算对称归一化拉普拉斯矩阵L_sym
L_sym = np.eye(*A.shape) - np.dot(D_inv_sqrt, np.dot(A, D_inv_sqrt))
print("对称归一化拉普拉斯矩阵 L_sym:")
print(L_sym)
对称归一化拉普拉斯矩阵 L_sym:
[[ 1. -0.5 -0.5]
[-0.5 1. -0.5]
[-0.5 -0.5 1. ]]
这段代码首先定义了邻接矩阵 A
,然后根据 A
计算了度矩阵 D
。接着,计算了 D
的逆平方根矩阵
D
i
n
v
s
q
r
t
D_inv_sqrt
Dinvsqrt,最后利用这些矩阵计算并打印出了对称归一化拉普拉斯矩阵
L
s
y
m
L_{sym}
Lsym