Graph Representation Learning【图最短路径优化/Node2vec/Deepwalk】

文章目录

      • Q1:
        • 网络性质:
          • 1.数据读取与邻接表构建:
          • 2.基本特征和连通性:
        • 算法思路:
          • 1. 广度优先搜索(BFS)标记前驱:
          • 2. 回溯生成所有最短路径:
        • 实验结果:
        • 复杂度分析:
      • Q2:
        • 算法思路:
          • 初始化
        • 实验结果:
        • 复杂度分析:
      • Q3:
        • 图表示学习:
        • 实验结果:
          • 结果分析:
          • ps:为什么不同距离度量的样本区分度大有不同?
        • 别的尝试:
      • 参考:

Q1:

DDI网络构建无向图并找出指定节点ij的所有最短距离

DDI网络可表示为:
G s m a l l = ( V s m a l l , E s m a l l ) V s m a l l = { 1 , 2 , 3 , 4 } E s m a l l = { ( 1 , 2 ) , ( 1 , 3 ) , ( 1 , 4 ) , ( 3 , 4 ) } G_{small}=(V_{small},E_{small})\\ V_{small}=\{1,2,3,4\} \\E_{small}=\{(1,2),(1,3),(1,4),(3,4)\} Gsmall=(Vsmall,Esmall)Vsmall={1,2,3,4}Esmall={(1,2),(1,3),(1,4),(3,4)}

网络性质:

无向无权的大规模稀疏图,我们一般用邻接表存储:

1.数据读取与邻接表构建:

​ 遍历所有边,为每个节点维护其邻接节点列表。对于边 ( (u, v) ),将 ( v ) 加入 ( u ) 的邻接列表,并将 ( u ) 加入 ( v ) 的邻接列表。
Adj [ u ] ← Adj [ u ] ∪ { v } , Adj [ v ] ← Adj [ v ] ∪ { u } \text{Adj}[u] \leftarrow \text{Adj}[u] \cup \{v\}, \quad \text{Adj}[v] \leftarrow \text{Adj}[v] \cup \{u\} Adj[u]Adj[u]{v},Adj[v]Adj[v]{u}

2.基本特征和连通性:

通过dfs得到图的连通性结果如下

在这里插入图片描述

  • 每个节点平均连接到大约47个其他节点

  • 这意味着整个图是一个单一的连通组件,没有孤立的子图,整个网络是完全连通的,任何两个节点之间都存在路径相连

以下为度数分布图:

在这里插入图片描述

算法思路:
  • 寻找两点之间的所有最短路径,使用**BFS+回溯**, 因为由上面的分析可知,图的平均度数很高,较为密集,最短路径长度较短,所以递归深度不会太高。
  • 但是在路径回溯阶段,虽然直观易实现,但在最短路径数量较多的情况下,递归深度和调用栈开销可能迅速增长,性能下降甚至栈溢出。所以先使用显式栈进行迭代回溯
  • 在回溯过程中,某些节点的路径可能会被多次访问。记忆化缓存可以保存已经计算过的路径,避免再次计算。
1. 广度优先搜索(BFS)标记前驱:
  1. 初始化距离 (d[s] = 0),其余节点 ( d[v] = inf )。
  2. 使用队列逐层扩展,更新节点的最短距离和前驱节点:
    ∀ v ∈ Adj [ u ] , 若  d [ v ] > d [ u ] + 1 ⟹ d [ v ] ← d [ u ] + 1 , prev [ v ] ← { u } 若  d [ v ] = d [ u ] + 1 ⟹ prev [ v ] ← prev [ v ] ∪ { u } \forall v \in \text{Adj}[u], \quad \text{若 } d[v] > d[u] + 1 \implies d[v] \leftarrow d[u] + 1, \ \text{prev}[v] \leftarrow \{u\} \\ \text{若 } d[v] = d[u] + 1 \implies \text{prev}[v] \leftarrow \text{prev}[v] \cup \{u\} vAdj[u], d[v]>d[u]+1d[v]d[u]+1, prev[v]{u} d[v]=d[u]+1prev[v]prev[v]{u}
  3. 当队列为空时结束。
2. 回溯生成所有最短路径:

从终点 ( t ) 启动,使用显式栈模拟递归过程,逐步构建所有从起点 ( s ) 到终点 ( t ) 的最短路径。与传统的回溯方法不同,这里我们利用记忆化搜索来缓存计算过的路径,以减少不必要的重复计算。

  • 使用栈中元素表示当前遍历状态:(当前节点, 当前路径)
  • 如果当前节点是起点 s,则路径已经完整,逆序将路径加入结果集中。
  • 如果当前节点不是起点,首先检查该节点是否已经有缓存路径(通过 memo 字典)。如果有,则直接从缓存中取出路径;否则,遍历当前节点的前驱节点,将所有可能的路径推入栈中。
实验结果:

对于(8,309)、(67,850)、(990,1256)药物的最短路径:
在这里插入图片描述

使用time模块:对于最短路径较多的用时较少。

在这里插入图片描述

复杂度分析:
  • BFS会遍历所有边和节点来计算最短路径,并且回溯最短路径时涉及到路径构建
  • 实际最坏时间复杂度比没有缓存时更低,但是由于使用了记忆化搜索,减少了重复计算

O ( E + ( V + E ) + K ⋅ L ) V 为节点数, E 为边数, K 是路径数量 , L 是路径最大长度 O(E + (V + E) + K \cdot L)~~~~~\\V为节点数,E为边数,K是路径数量,L是路径最大长度 O(E+(V+E)+KL)     V为节点数,E为边数,K是路径数量,L是路径最大长度

Q2:

计算所有正负药物对的最短距离并可视化对比两类样本的结果

列表数据含义药物对的数量
DDIposDDI网络中存在相互作用的药物对(正样本)1601
DDInegDDI网络中没有相互作用的药物对(负样本)1601
算法思路:
  • 不同于Q1寻找所有的最短路径, 要计算大量节点间的最短距离,所以我们之间使用BFS即可,考虑到效率,特别是在查询较长路径时,尝试双向广度优先搜索
  • 从起点和终点同时开始搜索,直到两者相遇。这样可以显著减少搜索的空间,尤其是对于大的图,因为搜索空间的半径会从两个方向扩展,通常比从一个方向全图扩展要小。
  1. 初始化

    定义两个队列 Q_sQ_t,分别从起点 s 和终点 t 启动:
    dist ( s , s ) = 0 , dist ( t , t ) = 0 \text{dist}(s, s) = 0,\quad \text{dist}(t, t) = 0 dist(s,s)=0,dist(t,t)=0

  2. 交替扩展搜索队列:

    • Q_s 中取出节点 u 及其当前距离 d_s,对每个邻居 w

      w ∉ visited s ⇒ 加入  Q s , dist ( s , w ) = d s + 1 w \notin \text{visited}_s \Rightarrow \text{加入 } Q_s,\quad \text{dist}(s, w) = d_s + 1 w/visiteds加入 Qs,dist(s,w)=ds+1

    • Q_t 中取出节点 v 及其当前距离 d_t,对每个邻居 w'

      w ′ ∉ visited t ⇒ 加入  Q t , dist ( t , w ′ ) = d t + 1 w' \notin \text{visited}_t \Rightarrow \text{加入 } Q_t,\quad \text{dist}(t, w') = d_t + 1 w/visitedt加入 Qt,dist(t,w)=dt+1

  3. 路径相遇判定:
    当存在某个节点
    x ∈ visited s ∩ visited t x \in \text{visited}_s \cap \text{visited}_t xvisitedsvisitedt
    最短路径长度为:
    dist ( s , t ) = dist ( s , x ) + dist ( t , x ) \text{dist}(s, t) = \text{dist}(s, x) + \text{dist}(t, x) dist(s,t)=dist(s,x)+dist(t,x)

  4. 不可达判断:
    若两个队列均为空仍未相遇,说明 st不可达。

实验结果:

在这里插入图片描述

正负样本对的距离柱状图如下:

正样本对最短距离几乎都分布在24,负样本对分布在56。

复杂度分析:

最短路径长度为 d,即
d i s t ( s , t ) = d dist(s,t)=d dist(s,t)=d
分别从 ( s )、( t ) 同时扩展,搜索深度减半
假设图的平均度为 𝑑 ˉ ,则 B F S 深度为 𝑘 时,节点数量近似为 𝑂 ( 𝑑 ˉ k ) 搜索节点数近似为: O ( d ˉ d / 2 ) 假设图的平均度为 \bar𝑑 ,则 BFS 深度为 𝑘 时,节点数量近似为 𝑂(\bar𝑑^k)\\搜索节点数近似为:O(\bar{d}^{d/2}) 假设图的平均度为dˉ,则BFS深度为k时,节点数量近似为O(dˉk)搜索节点数近似为:O(dˉd/2)

  • 最坏情况:要遍历整个图,时间复杂度仍为
    O ( V + E ) V 为节点数, E 为边数 O(V + E) ~~~~~V为节点数,E为边数 O(V+E)     V为节点数,E为边数

  • 平均情况:因搜索深度减半,效率提高:

O ( d ˉ d / 2 ) O(\bar{d}^{d/2}) O(dˉd/2)

Q3:

对药物节点进行embedding并在嵌入空间计算可视化表征向量的欧式距离/余弦距离,并进行分析比较

图表示学习:
  • Deepwalk:一张图上随机生成节点序列,用这些节点序列以Word2vec方法生成embedding。对比Word2vec,把每一个“词”看做节点,得到每个节点的embedding后求两两embedding的余弦相似度,得到top N的近邻排序推荐给目标节点。

  • Node2vec:添加控制游走方向的参数,BFS更体现结构性,DFS更体现同质性(远端节点)

    • 参数p:控制“回头"概率

    • 参数q:控制偏向BFS or DFS

实验结果:
  • 节点嵌入:dimensions=128,walk_length=30num_walk=100

  • node2vec: 超参设置不同,对比实验结果如下:

在这里插入图片描述

boxplot绘制直观展示:

结果分析:
  • Deepwalk:采用 均匀 的随机步长探索邻域。这样,DeepWalk 强调的是 节点之间的共现频率,由于没有对邻域进行加权或偏向某一类邻域结构,DeepWalk 对 直接连接节点对 的敏感度相对较低,无法很好地区分 局部 邻域的细节。
  • Node2vec:
    • 当 p 值较小,q 值较大时,Node2Vec 强调 局部邻域结构。此时,模型倾向于对 直接连接的节点对 给予较高的权重,使得正样本(直接连接的节点对)的欧氏距离显著小于负样本。这使得 局部结构 更容易被区分。虽然这种设置能够有效提高欧氏距离的区分度,但 余弦距离 的区分度相对较弱,因为它对空间的聚集性不如欧氏距离敏感。
    • 当 p 值较大,q 值较小时,Node2Vec 强调 全局结构,类似于 深度优先搜索(DFS)。在这种设置下,Node2Vec 更倾向于 捕捉较远的、非直接连接节点的关系,从而使得正负样本在 余弦距离 上的分布更加分散,区分度更佳。但与此同时,由于较大 p 值导致的 探索全局结构,负样本和正样本的 欧氏距离 变得相对较小,且整体的聚集度较高。
ps:为什么不同距离度量的样本区分度大有不同?

如果主要关注近邻节点,直接相连的节点关注度较高,欧氏距离更容易区分,而余弦距离 的区分度较弱,因为余弦距离对相似性度量的需求更加依赖于 整体方向,而不单单是相对距离。但是如果更倾向捕捉到节点在 全局图结构中的角色,正负样本的 欧氏距离 会趋于较小,因为这时节点间的连接不再仅限于直接邻域。

别的尝试:
  • 鉴于图神经网络具备端到端训练的能力,后尝试采用生成式模型来学习节点的表示(embedding),GAE 与 VGAE 本质上建模的是图数据的生成过程,因此在理论上具备较强的表达能力。
  • 但是,查阅到文献中普遍指出这类模型依赖于节点的属性信息作为输入特征。而在本实验中,图中仅包含节点及其连接关系,缺乏节点特征,因此只能使用全1或one-hot等虚拟特征作为替代。在这种特征缺失的情况下,模型难以从输入中学习到有效的结构区分信息,最终导致 GAE/VGAE 的实验表现明显低于Node2Vec 方法。

在这里插入图片描述

参考:

[1] CS224W | Home (stanford.edu)

[2] 1.1 - Why Graphs_哔哩哔哩_bilibili

[3] Graph Embedding - (maelfabien.github.io)

[4] rfp0191-wangAemb.pdf (kdd.org)

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

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

相关文章

MATLAB中的概率分布生成:从理论到实践

MATLAB中的概率分布生成:从理论到实践 引言 MATLAB作为一款强大的科学计算软件,在统计分析、数据模拟和概率建模方面提供了丰富的功能。本文将介绍如何使用MATLAB生成各种常见的概率分布,包括均匀分布、正态分布、泊松分布等,并…

经典算法 (A/B) mod C

(A/B) mod C 问题描述 求(A/B)%C,但由于A和B实在太大了,我们只给出A % C,B % C。 (我们保证给定的A必能被B整除,且gcd(B,C) 1)。 输入描述 输入一行三个整数,分别是A % C,B % C,C。 输出…

大数据技术的主要方向及其应用详解

文章目录 一、大数据技术概述二、大数据存储与管理方向1. 分布式文件系统2. NoSQL数据库3. 数据仓库技术 三、大数据处理与分析方向1. 批处理技术2. 流处理技术3. 交互式分析4. 图计算技术 四、大数据机器学习方向1. 分布式机器学习2. 深度学习平台3. 自动机器学习(AutoML) 五、…

Deeper and Wider Siamese Networks for Real-Time Visual Tracking

现象: the backbone networks used in Siamese trackers are relatively shallow, such as AlexNet , which does not fully take advantage of the capability of modern deep neural networks. direct replacement of backbones with existing powerful archite…

ubuntu22.04卸载vscode

方法 1:通过 Snap 卸载 VSCode 如果你是通过 Snap 安装的 VSCode(Ubuntu 22.04 默认推荐方式),按照以下步骤卸载: 检查是否通过 Snap 安装: bash snap list | grep code如果输出显示 code,说明…

OpenCV 背景建模详解:从原理到实战

在计算机视觉领域,背景建模是一项基础且重要的技术,它能够从视频流中分离出前景目标,广泛应用于运动目标检测、视频监控、人机交互等场景。OpenCV 作为计算机视觉领域最受欢迎的开源库之一,提供了多种高效的背景建模算法。本文将深…

Android native崩溃问题分析

最近在做NDK项目的时候,出现了启动应用就崩溃了,崩溃日志如下: 10:41:04.743 A Build fingerprint: samsung/g0qzcx/g0q:13/TP1A.220624.014/S9060ZCU4CWH1:user/release-keys 10:41:04.743 A Revision: 12 10:41:04.743 A ABI: arm64…

【Shell的基本操作】

文章目录 一、实验目的二、实验环境三、实验内容3.1 Shell变量与脚本基础3.2 定制终端提示符(PS1变量)3.3 文件查找与类型确认(find命令)3.4 管道命令实战(用户登录统计)3.5 交互式备份压缩脚本 四、总结4.…

快速选择算法:优化大数据中的 Top-K 问题

在处理海量数据时,经常会遇到这样的需求:找出数据中最大的前 K 个数,而不必对整个数据集进行排序。这种场景下,快速选择算法(Quickselect)就成了一个非常高效的解决方案。本文将通过一个 C 实现的快速选择算…

AQS 基本思想与源码分析

充分了解 AbstractQueuedSynchronizer 对于深入理解并发编程是有益处的,它是用来构建锁或者其他同步组件的基础框架,我们常用的同步工具类如 CountDownLatch、Semaphore、ThreadPoolExecutor、ReentrantLock 和 ReentrantReadWriteLock 内部都用到了它。…

理解位图算法:使用 C++ 实现高效数据查重

在处理海量数据时,我们常常需要检查某个元素是否已经存在于集合中。传统的方法如哈希表或集合容器虽然有效,但在数据量极大的情况下会占用大量内存。这时,位图算法 (Bitmap) 就成为了一种非常高效的解决方案。本文将通过分析一段使用位图算法…

数学复习笔记 12

前言 现在做一下例题和练习题。矩阵的秩和线性相关。另外还要复盘前面高数的部分的内容。奥,之前矩阵的例题和练习题,也没有做完,行列式的例题和练习题也没有做完。累加起来了。以后还是得学一个知识点就做一个部分的内容,日拱一…

1-10 目录树

在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。 输入格式: 输入首先给出正整数N(≤104)…

Python爬虫实战:研究 RPC 远程调用机制,实现逆向解密

1. 引言 在网络爬虫技术的实际应用中,目标网站通常采用各种加密手段保护其数据传输和业务逻辑。这些加密机制给爬虫开发带来了巨大挑战,传统的爬虫技术往往难以应对复杂的加密算法。逆向解密作为一种应对策略,旨在通过分析和破解目标网站的加密机制,获取原始数据。 然而,…

debugfs:Linux 内核调试的利器

目录 一、什么是 debugfs?二、debugfs 的配置和启用方式2.1 内核配置选项2.2 挂载 debugfs2.3 Android 系统中的 debugfs 三、debugfs 的典型应用场景3.1 调试驱动开发3.2 内核子系统调试3.3 性能分析 四、常见 debugfs 子目录与功能示例4.1 /sys/kernel/debug/trac…

lua 作为嵌入式设备的配置语言

从lua的脚本中获取数据 lua中栈的索引 3 | -1 2 | -2 1 | -3 可以在lua的解释器中加入自己自定的一些功能,其实没啥必要,就是为了可以练习下lua

棋牌室台球室快速接入美团团购接口

北极星平台从2024年12月份开始慢慢关闭,现在很多开发者反馈北极星token已经不能刷新了,全部迁移到美团团购综合平台。 申请这个平台要求很高 1、保证金费用要15万起步 2、平台必须是二级等保和安全产品 ,一个二级等保费用10万起步 所以很多…

开源轻量级地图解决方案leaflet

Leaflet 地图:开源轻量级地图解决方案 Leaflet 是一个开源的 JavaScript 库,用于在网页中嵌入交互式地图。它以轻量级、灵活性和易用性著称,适用于需要快速集成地图功能的项目。以下是关于 Leaflet 的详细介绍和使用指南。 1. Leaflet 的核心…

一个批量文件Dos2Unix程序(Microsoft Store,开源)1.1.0 编码检测和预览

之前的版本是个意思意思,验证商店发布的(其实是我以前自己用的工具),这次把格式检查和转换都做上了,功能应该差不多了,还有一些需要小改进的地方。 因为还没什么用户嘛,还是保持全功能免费试用。…

特征提取:如何从不同模态中获取有效信息?

在多模态学习中,不同模态(文本、图像、语音、视频、传感器数据等)所携带的信息丰富且互补。但不同模态的数据结构、表示空间、时空分布截然不同,因此,如何对各模态进行高效、有效的特征提取,是整个多模态学…