graph Laplacian 拉普拉斯矩阵

本文介绍了拉普拉斯矩阵的基本概念及其在降维、聚类中的应用。重点讲解了拉普拉斯矩阵的构建过程、性质以及如何利用它进行谱聚类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拉普拉斯矩阵是个非常巧妙的东西,它是描述图的一种矩阵,在降维,分类,聚类等机器学习的领域有很广泛的应用。

什么是拉普拉斯矩阵

拉普拉斯矩阵

  先说一下什么是拉普拉斯矩阵,英文名为Laplacian matrix,其具体形式得先从图说起,假设有个无向图如下所示, 
  

无向图

  其各个点之间的都有相应的边连接,我们用某个指标(这地方可以任意选择,比如欧氏距离、测地距离、或者高斯相似度等)来衡量两个点的相似度,表示为 W=wij ,没有边连接的其相似度自然为零, W 是个对称矩阵;某个点的与所有点的相似度之和,表示为 D=dig(d);d=rowSum(W) D 是个对角阵;我们的拉普拉斯矩阵则是 L=DW

拉普拉斯矩阵的性质

  性质: 
  (1) L 是半正定矩阵。 
  (2) L 的最小特值为0,对应特向为全1列向量。 
  (3)对 Lf=λDf m 个非负实特征值, 0=λ1λ2...λm
  (4)对于任意一个属于实向量 fRm ,都有此公式成立: 
   fTLf=12mi,j=1wij(fifj)2  
  它又有什么用处呢?跟目标是有关系的,哈哈~ 
  证明如下:   f m1 的实数列向量 
   fTLf=fTDffTWf  
   =fTdig(d)ffTWf  
   =mi=1dif2imj=1[i=1fjwij]fj  
  因为 mi,j=1fifjwij=mj=1[mi=1fiwij]yj 所以 
   =mi=1dif2imi,j=1fifjwij    
   =12[mi=1dif2i2mi,j=1fifjwij+mj=1djf2j]  
   =12mi,j=1wij(fifj)2  
  

拉普拉斯特征映射

  拉普拉斯特征映射将处于流形上的数据,在尽量保留原数据间相似度的情况下,映射到低维下表示。 
  其步骤如下: 
  1. 构造近邻图(用近邻图图近似流形) 
    1.1 近邻条件 ||xixj||2ϵ ,  xi 表示第 i 个样本。 
    1.2 K近邻 
  2. 计算边权重(即样本间相似度) 
    2.1 热核  wij=exp(||xixj||2t)0ij  
    2.2 简单形式 wij={10xixj  
  3. 特征映射 
    求解 Lf=λDf ;广义特征值问题。 
    得到解如下:(特向和特值) 
     {Lf0=λ0Df0;Lf1=λ1Df1;...Lfm=λmDfm0=λ0λ1...λm  
    取小的前 k f 来嵌入到 k 维欧氏空间里。 
     xi>(f1(xi),f2(xi),...,fk(xi))  
  至于为神马 min[mi,j=1wij||yiyj||2tr(YTLY)] ,愣是没有看出所以然来,哎~ 
  倒腾了一大通,终于把为什么目标 min[mi,j=1wij||SiSj||2] 等价于 min[yTLy] 给搞明白了。 yRm  
  具体解释如下图所示:(左侧是基本思路,中间是核心推导,右侧是直观理解) 
  

拉普拉斯映射推导

  但是 还有个问题没有解决 ,就是为什么 min(yTLy) 等价于 min[tr(yTLy)] ,并且转换成立找最小的广义特征值 Ly=λDy ? 
   只能从直觉上理解 yTLy 可以化为 λ1z21+λ2z22+...+λmz2m 的样子,最小化这个平方和的式子,也就是最小化其系数和,也就是最小化特值,也就是找对应特向。拉普拉斯矩阵是实对称矩阵,不同特值对应正交特向,可以通过正交变换(此处用到了特向)得到形如平方和的标准二次型。 
  为什么是用广义特征值 Ly=λDy 没有搞懂,囧? 
   拉普拉斯映射就是直接在低维下找到样本,使得所有样本保持原来的相似度。

应用于降维

  求解广义特征向量,取前几个非零最小特值对应的特向,即为原数据在低维下的表示。

应用于聚类

  三个概念: 
  (1)对于邻接矩阵,定义图中A子图与B子图之间的所有边的权重之和为: W(A,B)=iA,jBWij  
   W 为所有边的权重,及样本间相似度矩阵。 
  (2)与某点的所有边的权重和定义为该顶点的度 di=mj=1Wij  
  (3)Graph Cut,就是把一个图的一些边切断,把一个图变为若干独立的子图,而这些被切断的边的权重之和称为Cut值。 
  对于如下图,我们想找到某个割把整个图分成两个子图。 
  

谱聚类

   Cut(A,B)=iA,jBwij  
  上面的割会把孤立节点分割出来,为避免这种情况,出现了RatioCut以及NormalizedCut: 
   RatioCut=cut(A,B)|A|+cut(A,B)|B|  
   NCut=cut(A,B)vol(A)+cut(A,B)vol(B)  
  其中 |A| 表示 A 中节点的数目, vol(A)=iAwij ,此两者都可以算作 A 的大小的一种度量 。 
   谱聚类,由最小割入手,转换到最小化二次型求解,其中包含了拉普拉斯映射降维的思想。  
  例如,取 qi={c1c2iAiB  
  则 Cut(A,B)=iA,jBwij  
   mi=1mj=1wij(qiqj)2=qTLq 这里跟上面的一样了。这里做了 松弛处理 即q不再是取值为某两个值了,而是任意实数 。 
  Rayleigh quotient(瑞利商) R(L,q)=qTLqqTq  
  其最大值和最小值分别等于矩阵 L 最大和最小的特值分别对应的特向。 
  因此,最小化割问题,也就变成了找 L 的非零最小特值对应特向的问题了。求解特向: Lq=λq ,排序特值,选择特向,传统聚类方法开搞。 
  我们想把原图分成两个子图,肯定找到一个最小割对应的特向即可,那么要是想分成3个子图,那就需要最小割和次小割所对应的特向解即可。(这个地方这样理解会直观一些, 最小割对应的特向是降维后包含分割为两个子图的信息,而最小割加次小割对应的特向则是包含分割为3个子图的信息) 聚几类,则取前几个最小非零特值对应的特向的意义就在于此。 
   谱图理论需要找个时间看看。

小结

  1)拉普拉斯矩阵是一种图的矩阵表示。 
  2)拉普拉斯映射是在保持原流形数据相似度的情况下,直接降维到低维空间。 
  3)谱聚类是通过最小割,刚好借助了拉普拉斯映射的思想,从而用携带切割信息的特向来表征原流形数据,再去聚类。(相比于传统聚类,谱聚类更侧重于数据相似度信息的保留,更具有针对性,计算效率也更高) 
  三者紧密联系,又不能混为一谈。 
几个参考: 
1)化二次型为标准型 
http://student.zjzk.cn/course_ware/web-gcsx/gcsx/chapter5/chapter5_2_1.htm 
2)一个关于拉普拉斯矩阵的博客 
http://blog.sciencenet.cn/blog-261330-751483.html 
3)一个谱聚类的博客 
http://blog.pluskid.org/?p=287 
4)广义特征值的介绍 
http://webcache.googleusercontent.com/search?q=cache:_85fSHsIv3MJ:https://zh.wikipedia.org/zh-cn/%25E7%2589%25B9%25E5%25BE%2581%25E5%2590%2591%25E9%2587%258F+&cd=1&hl=zh-CN&ct=clnk&gl=cn&lr=lang_en%7Clang_zh-CN%7Clang_zh-



转自:http://blog.youkuaiyun.com/yujianmin1990/article/details/48420483

### 使用拉普拉斯矩阵在 PyTorch 中实现图神经网络 #### 背景介绍 拉普拉斯矩阵是一种用于描述图结构的重要工具,在图神经网络(Graph Neural Networks, GNNs)中被广泛应用于节点特征的学习和传播。通过将图的拓扑信息编码到拉普拉斯矩阵中,可以更好地捕捉节点之间的关系并提升模型性能。 #### 拉普拉斯矩阵定义 对于一个无向加权图 \(G=(V,E)\),其邻接矩阵为 \(A\),度矩阵为 \(D\),则标准化后的拉普拉斯矩阵可表示为: \[ L = I - D^{-\frac{1}{2}} A D^{-\frac{1}{2}} \] 其中 \(I\) 是单位矩阵[^1]。 #### 在 PyTorch 中实现拉普拉斯矩阵 以下是基于 PyTorch 的代码示例,展示如何构建拉普拉斯矩阵以及将其应用到图卷积操作中: ```python import numpy as np import torch def calculate_laplacian(adj_matrix): """计算标准化的拉普拉斯矩阵""" degree_matrix = np.diag(np.sum(adj_matrix, axis=1)) # 度矩阵 laplacian = np.eye(adj_matrix.shape[0]) - np.linalg.inv(degree_matrix.sqrt()) @ adj_matrix @ np.linalg.inv(degree_matrix.sqrt()) return laplacian # 假设我们有一个邻接矩阵 adjacency_matrix = np.array([ [0, 1, 0], [1, 0, 1], [0, 1, 0] ]) laplacian_matrix = calculate_laplacian(adjacency_matrix) # 将数据转换为张量形式以便于后续处理 features = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float) # 节点特征 y = torch.tensor([0, 1, 0], dtype=torch.long) # 标签 adj_tensor = torch.tensor(laplacian_matrix, dtype=torch.float) # 拉普拉斯矩阵转为张量 class SimpleGCN(torch.nn.Module): def __init__(self, input_dim, output_dim): super(SimpleGCN, self).__init__() self.linear = torch.nn.Linear(input_dim, output_dim) def forward(self, x, adj): support = self.linear(x) output = torch.matmul(adj, support) return output model = SimpleGCN(input_dim=1, output_dim=2) output = model(features, adj_tensor) print(output) ``` 上述代码实现了以下几个功能: 1. **拉普拉斯矩阵计算**:`calculate_laplacian` 函数负责根据输入的邻接矩阵生成标准化的拉普拉斯矩阵。 2. **数据预处理**:将节点特征、标签和拉普拉斯矩阵转化为 PyTorch 张量[^2]。 3. **简单 GCN 定义**:自定义了一个简单的图卷积层 `SimpleGCN`,该层接受节点特征和拉普拉斯矩阵作为输入,并返回经过卷积运算的结果。 #### 关键点说明 - **标准化的重要性**:为了防止数值不稳定性和加速收敛,通常会采用标准化的形式来定义拉普拉斯矩阵。 - **图卷积的核心思想**:通过对节点特征施加拉普拉斯平滑效应,使得相邻节点的信息能够相互融合,从而增强局部连通性的表达能力。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值