归一化拉普拉斯矩阵

基本概念

归一化拉普拉斯矩阵是图谱论中的一种重要矩阵表示方法,主要用于处理图结构的数据。它基于原始的拉普拉斯矩阵进行变换,旨在强调图的结构特性,并在图的谱分析、尤其是图卷积网络(GCNs)等机器学习应用中扮演关键角色。
归一化拉普拉斯矩阵主要有两种形式:对称归一化和随机游走归一化。

  1. 对称归一化拉普拉斯矩阵(Symmetrically Normalized Laplacian):
    定义为 L s y m = D − 1 / 2 L D − 1 / 2 L_{sym} = D^{-1/2}LD^{-1/2} Lsym=D1/2LD1/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,有利于谱聚类和谱图划分。

  2. 随机游走归一化拉普拉斯矩阵(Random Walk Normalized Laplacian):
    定义为 L r w = D − 1 L L_{rw} = D^{-1}L Lrw=D1L
    这种归一化形式模拟了从图中的任意节点出发进行随机游走的过程,通过除以节点的度来确保从每个节点出发的概率总和为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的逆平方根D1/2

对角矩阵 D 的逆平方根 D − 1 / 2 只需对每个对角元素取平方根后再取倒数。 对角矩阵 D 的逆平方根 D^{-1/2} 只需对每个对角元素取平方根后再取倒数。 对角矩阵D的逆平方根D1/2只需对每个对角元素取平方根后再取倒数。
因此,对于每个度为 d i 的节点,其对应的 D − 1 / 2 中的元素为 1 / d i 。 因此,对于每个度为 d_i 的节点,其对应的 D^{-1/2} 中的元素为 1/\sqrt{d_i} 。 因此,对于每个度为di的节点,其对应的D1/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} D1/2= 1/2 0001/2 0001/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} D1/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=D1/2LD1/2,其中L=DA是未归一化的拉普拉斯矩阵。

首先计算 ( 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=DA= 200020002 011101110 = 211121112

然后,将 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=D1/2LD1/2= 0.70710000.70710000.7071 211121112 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.41420.70710.70710.70711.41420.70710.70710.70711.4142 0.70710000.70710000.7071 = 111111111

最终得到的对称归一化拉普拉斯矩阵 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= 111111111

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不易撞的网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值