⌈ 传知代码 ⌋ 基于曲率的图重新布线

news2024/7/30 15:15:54

💛前情提要💛

本文是传知代码平台中的相关前沿知识与技术的分享~

接下来我们即将进入一个全新的空间,对技术有一个全新的视角~

本文所涉及所有资源均在传知代码平台可获取

以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~


📌导航小助手📌

  • 💡本章重点
  • 🍞一. 概述
  • 🍞二. 核心算法
  • 🍞三. 关键代码
  • 🍞四. 运行方法
  • 🍞五.运行结果
  • 🫓总结


💡本章重点

  • 基于曲率的图重新布线

🍞一. 概述

论文链接

Topping, Jake, et al. “Understanding over-squashing and bottlenecks on graphs via curvature.” arXiv preprint arXiv:2111.14522 (2021).

大多数图神经网络(Graph Neural Networks, GNN)使用消息传递范式,其中节点特征在输入图上传播。最近的研究表明,来自远距离结点的信息流失真,是限制依赖远程交互的任务的消息传递效率的重要因素。

该限制被称为“过度挤压”(Over-squashing)。过度挤压的原因在于,图中每个结点的k跳邻居的数量随着k的增长而指数级增长,远距离结点的信息难以压缩到固定大小的结点特征中,从而导致信息丢失。本文提供了对GNN中过度挤压现象的精确描述,并分析了它是如何从图中的瓶颈产生的。

为此,本文引入了一种新的基于边的组合曲率,并证明了负曲率边是导致过度挤压问题的原因。本文还提出了一种基于曲率的图重现布线方法,以缓解过度挤压问题。

在这里插入图片描述
上图:曲面上曲率的演变可能会减少瓶颈。

下图:本文展示了如何在图上做同样的事情来提高GNN的性能。蓝色代表负曲率;红色代表正曲率。


🍞二. 核心算法

算法说明

在这里插入图片描述

  1. 黎曼几何中的一个自然对象是里奇曲率(Ricci curvature),这是一种决定测地线色散的双线性形式,即从“相同”速度的附近点开始的测地线是否保持平行(欧几里得空间)、收敛(球面空间)或发散(双曲空间)。
  2. 算法在每次迭代中都会添加一条边来支持图中最负曲率的边,然后移除最正曲率的边。
  3. 原始输入图和重新布线图之间的图编辑距离以max number of iterations 的 2 倍为界。
  4. 移除曲率最大的边是为了平衡曲率和结点的度的分布。

🍞三. 关键代码

def sdrf(data, max_iterations=10, remove_edges=True, remove_bound=0.5, tau=1.0, undirected=True):
    # 1. 将torch_geometric.data.Data实例转化为networkx.DiGraph实例,方便后续加边、减边操作
    G = to_networkx(data)
    if undirected:
        G = G.to_undirected()
    
    # 2. 获取图信息(邻接矩阵,边的个数)
    edge_index = data.edge_index
    if undirected:
        edge_index = to_undirected(edge_index)
    A = to_dense_adj(remove_self_loops(edge_index)[0])[0]  # 邻接矩阵
    A = A.cuda()
    N = A.shape[0]  # 边的个数

    C = torch.zeros(N, N).cuda()  # 初始化Ricci曲率矩阵,即Ric(i, j)

    # 3. 进入图的加边、减边循环过程,其中max_iterations为最大迭代次数
    for x in range(max_iterations):
        can_add = True

        # 3.1 根据BFC算法更新Ricci曲率矩阵
        balanced_forman_curvature(A, C=C)

        ix_min = C.argmin().item()
        x = ix_min // N
        y = ix_min % N

        # 3.2 计算可加边的候选集candidates
        if undirected:
            x_neighbors = list(G.neighbors(x)) + [x]
            y_neighbors = list(G.neighbors(y)) + [y]
        else:
            x_neighbors = list(G.successors(x)) + [x]
            y_neighbors = list(G.predecessors(y)) + [y]
        candidates = []
        for i in x_neighbors:
            for j in y_neighbors:
                if (i != j) and (not G.has_edge(i, j)):
                    candidates.append((i, j))

        # 3.3 根据边添加之后对Ricci曲率的提升程度,从候选集中选择边k~l进行添加
        if len(candidates):
            D = balanced_forman_post_delta(A, x, y, x_neighbors, y_neighbors)
            improvements = []
            for i, j in candidates:
                improvements.append((D - C[x, y])[x_neighbors.index(i), y_neighbors.index(j)].item())

            k, l = candidates[np.random.choice(range(len(candidates)), p=softmax(np.array(improvements), tau=tau))]
            G.add_edge(k, l)  # 添加边
            if undirected:
                A[k, l] = A[l, k] = 1
            else:
                A[k, l] = 1
        else:
            can_add = False
            if not remove_edges:
                break

        # 3.4 移除具有最大Ricci曲率的边,其中remove_bound为曲率最大上界
        if remove_edges:
            ix_max = C.argmax().item()
            x = ix_max // N
            y = ix_max % N
            if C[x, y] > remove_bound:
                G.remove_edge(x, y)  # 移除边
                if undirected:
                    A[x, y] = A[y, x] = 0
                else:
                    A[x, y] = 0
            else:
                if can_add is False:
                    break

    # 4. 将networkx.DiGraph实例转化为torch_geometric.data.Data实例,返回
    return from_networkx(G)

🍞四. 运行方法

数据集

支持 Cora, Citeseer, Pubmed, Cornell, Texas, Wisconsin

脚本自动下载。如不能请参考 geom-gcn

配置文件

不同数据集的配置文件位于./configs/。运行之前需要修改数据集根目录和输出目录:

output_dir: $OUTPUT_DIR$
data:
  root: $DATA_ROOT$

训练和测试

# train on train data splits
python train.py --config-file configs/*.yaml
# test on val and test data splits
python eval.py --config-file configs/*.yaml
search_dir=configs
for file in "$search_dir"/*
do
    python train.py --config-file $file
    python eval.py --config-file $file
done

🍞五.运行结果

运行日志、模型权重、重新布线结果保存在 $OUTPUT_DIR/$DATASET_NAME/

测试结果(accuracy)保存在 ./result.csv

在这里插入图片描述


🫓总结

综上,我们基本了解了“一项全新的技术啦” 🍭 ~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

【传知科技 – 了解更多新知识】

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

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

相关文章

SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-09-01 10:00:002021-09-01 10:00:20011NULL210520022021-09-10 11:00:002021-09-10 11:00:30101NULL310120012021-10-01 10:00:002021-10-01 10:00…

如何获取MySQL中表的大小?(官方校正版)

与大多数关系数据库一样,MySQL 提供了有关数据库本身的有用元数据。虽然大多数其他数据库将此信息称为 catalog, 但MySQL 官方文档INFORMATION_SCHEMA 将元数据 称为 tables。 目录 1 列出单个数据库中的单表大小 2 列出所有数据库中的所有表大小 以下…

从年金理论到杠杆效应,再到财务报表与投资评估指标

一、解释普通年金终值和普通年金现值的概念。 普通年金终值:以利率为1%,每期收款100元,5期为例,普通年金终值的折算过程如图: 普通年金现值:以利率为1%,每期收款100元,5期为例&am…

【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元|匿名对象|拷贝时一些编译器优化

目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1. 所有的成员,既可以在初始化列表初始化,也可以在函数体内初始化 2. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 3. 类中包含以下成员,必须放在初始化列表位置进行初始化&…

【设计模式】行为型设计模式之 备忘录模式(快照模式)

介绍 备忘录应用场景明确并且有限,一般用来数据的防丢失、撤销和恢复。对大对象的备份和恢复,备忘录模式能有效的节省时间和空间开销。 定义 备忘录模式:也称为快照模式,在不违背封装原则的前提下,捕获一个对象的内…

20240610 基于QGIS生成地区示意图的地图shp文件

目录 本文目标前置条件具体步骤1. 创建Project2. 插入世界地图3. 对地区示意图进行地理匹配4. 创建shp文件,勾画轨迹 注意事项 本文目标 基于QGIS生成地区示意图的地图shp文件,此shp文件可以用来学习,但是未经审批不可用于发表。 前置条件 …

水滴型锤片粉碎机:多功能粉碎利器

在现代工业生产中,粉碎机作为一种重要的机械设备,广泛应用于饲料、化工、木材等多个领域。其中,水滴型锤片粉碎机凭借其设计和粉碎能力,成为市场上的热门产品。 水滴型锤片粉碎机其设计灵感来源于水滴的形态。这种设计使得机器在…

【全开源】房屋出租出售预约系统(FastAdmin+ThinkPHP+Uniapp)

房屋出租出售预约系统:一站式解决房产交易难题 一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统,支持小程序、H5、APP,包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有:新盘销售、房屋租赁、地图找…

Android 事件分发机制详解(上)

前言 Android事件分发机制是Android开发者必须了解的基础。 目录 一. 基础认知 1.1 事件分发的由来 安卓的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解…

cefsharp124.x升级125.x(cef125.0.21/Chromium 125.0.6422.142)

一、版本说明 1.1 依赖关系变化 依赖移除:cef.redist.x64,cef.redist.x86增加新支持chromiumembeddedframework.runtime 旧版本需要移除依赖cef.redist.x64和cef.redist.x86否则会初始化异常。 自版本121.*以后common依赖关系变化 chromiumembeddedframework.runtime.win-x6…

25.逢七必过

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/363 题目描述 逢七必过的游戏规则如下:对一…

训练集和测试集的分布一致性分析

规律一致性分析的实际作用   在实际建模过程中,规律一致性分析是非常重要但又经常容易被忽视的一个环节。通过规律一致性分析,我们可以得出非常多的可用于后续指导后续建模的关键性意见。通常我们可以根据规律一致性分析得出以下基本结论: …

【T3】畅捷通T3软件查询明细账等账簿,出现某些列串位置。

【问题描述】 查询畅捷通T3软件科目明细账的时候, 出现某些行的数据串位置, 摘要、金额、方向都没有在对应的列。 【解决方案】 根据跟踪发现,最终在客户档案上发现问题。 数据串位中对应的客户名称、简称中的对后面多了一个【tab】键的空格…

信息学奥赛初赛天天练-25-CSP-J2023基础题-中序、前序与后序转换秘籍,二叉树构建、遍历技巧,以及图的拓扑排序实战应用

PDF文档公众号回复关键字:20240610 2023 CSP-J 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 11 给定一棵二叉树,其前序遍历结果为:ABDECFG,中序遍历结果…

数据结构(4):串

只需要掌握小题,在考纲中占比不大 1 串的定义 1.1 基本定义 字符串 数据结构三要数:逻辑结构、存储结构、运算 子串必须是连续的! 空格也是一个字符!每个空格字符占1B 1.2 串和线性表 2 串的基本操作 比值的操作!&…

腾讯云和windows11安装frp,实现内网穿透

一、内网穿透目的 实现公网上,访问到windows上启动的web服务 二、内网穿透的环境准备 公网服务器、windows11的电脑、frp软件(需要准备两个软件,一个是安装到公网服务器上的,一个是安装到windows上的) frp下载地址下载版本 1.此版本(老版…

【CW32F030CxTx StartKit开发板】使用SLogic Combo 8作为下载和调试工具

本来是参加21ic的评测活动,不知道为什么评测文章一直被提示有不良内容,所以只好先在此记录一下相关的资料。 CW32F030CxTx StartKit开发板自身不带下载和调试工具,需要另外购买。正好手上有个SLogic Combo 8,它可以作为DAPLink使…

零基础直接上手java跨平台桌面程序,使用javafx(二)可视化开发Scene Builder

我们只做实用的东西,不学习任何理论,如果你想学习理论,请去买几大本书,慢慢学去。 NetBeans有可视化工具,但是IntelliJ IDEA对于javafx,默认是没有可视化工具的。习惯用vs的朋友觉得,写界面还要是有一个布局…

Linux:基础开发工具

文章目录 Linux 软件包管理器 yum什么是软件包关于rzsz查看软件包安装软件卸载软件安装扩展源 Linux 编辑器 vimvim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)底行模式(last line mode) vim的基本操作[命令模式]切换至[插入模式][插入模式]切换至[命令模…

Linux下打印封装_统计函数执行时间_线程号时间戳打印

统计函数执行时间(多线程环境下统计结果不准) // 无返回值 #define FUNC_EXEC_TIME_NORET(fun,promote) ({ \ unsigned long long timeDelta 0; \ struct timespec t1 {0}; \ struct timespec t2 {0}; \ clock_gettime(CLOCK_MONOTONIC, &t1); \ …