【复杂网络建模】——基于Graph Convolutional Networks (GCN)进行链接预测

目录

一、复杂网络建模

二、图嵌入方法(Graph Convolutional Networks (GCN) )

1. 图表示:

2. 邻接矩阵(Adjacency Matrix):

3. 图卷积层(Graph Convolutional Layer):

4. 激活函数和损失函数:

5. 训练过程:

6. 应用:

三、基于PyTorch的GCN实现的示例代码


一、复杂网络建模

复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。

复杂网络的研究主要关注网络的拓扑结构、动力学行为和功能性质。其中一些常见的复杂网络模型包括小世界网络、无标度网络和随机网络。这些模型帮助我们理解网络中信息传播、稳定性、鲁棒性等方面的特性。

在实际应用中,复杂网络理论被用于解决许多问题,例如社交网络分析、疾病传播模型、电力系统优化等。这个领域的研究对于理解现实世界中复杂系统的行为具有重要意义。

复杂网络的建模方法多种多样,因取决于网络的性质、应用领域和研究问题。以下是一些常见的复杂网络建模方法:

  1. 随机图模型(Random Graph Models): 这包括 Erdős-Rényi 模型、Gilbert 模型等,其中节点之间的连接是随机生成的。这些模型通常用于研究网络的基本性质。

  2. 小世界网络模型(Small-World Models): Watts-Strogatz 模型是一个著名的小世界网络模型,它通过添加随机连接来模拟现实中的短路径和高聚集性。

  3. 无标度网络模型(Scale-Free Models): Barabási-Albert 模型是一个常见的无标度网络模型,其中网络的度分布遵循幂律分布。这种模型更好地捕捉了现实中一些节点拥有更多连接的现象,也就是所谓的“富者愈富”。

  4. 演化网络模型(Evolutionary Models): 这些模型考虑网络随时间演变的过程,包括节点的加入和离开,连接的形成和断裂。Leskovec 的 Preferential Attachment with Fitness Model 就是一个演化网络的例子。

  5. 时空网络模型(Spacetime Networks Models): 考虑网络随时间和空间的变化,尤其在交通流、移动网络等领域有应用。

  6. 复杂系统动力学模型: 使用微分方程、差分方程或代数方程等来描述网络中节点和连接的动力学行为。这类模型通常用于研究网络的稳定性、同步现象等。

  7. 社会网络建模方法: 在社会网络中,可以使用Agent-Based Modeling(基于代理的建模)等方法来考虑个体行为和相互作用,以更真实地模拟社交网络的演化。

  8. 复杂网络在具体领域的应用模型: 例如生物网络模型、交通网络模型、脑网络模型等。这些模型针对具体领域的特点进行了调整和拓展。

二、图嵌入方法(Graph Convolutional Networks (GCN) )

  1. 图嵌入(Graph Embedding):

    • 定义: 图嵌入是将图中的节点或边映射到低维向量空间的过程。目标是在低维空间中保留图的结构信息,使得相邻节点或边在向量空间中更接近。
    • 应用: 图嵌入可用于各种任务,如节点分类、节点聚类、图分类、链接预测等。常见的图嵌入方法包括DeepWalk、node2vec、GraphSAGE等。
  2. 图自编码器(Graph Autoencoder):

    • 定义: 图自编码器是一种神经网络结构,用于学习图的表示。它包括一个编码器和一个解码器,通过训练网络,使得输入图被映射到一个低维表示,同时尽量保留图的结构信息。
    • 应用: 图自编码器常用于无监督学习任务,如图的重构、降维、异常检测等。它们可以通过最小化重构误差来学习有效的图表示。Variational Graph Autoencoder (VGAE) 是图自编码器的一种变体,引入了变分推断的思想。

区别总结:

  • 图嵌入是一个更广泛的概念,描述了将图中的元素映射到低维空间的过程,而不限定于具体的学习方法。
  • 图自编码器是一种特定类型的神经网络结构,用于学习图的表示,通常通过编码器和解码器的结构来实现。

虽然图自编码器可以用于图嵌入,但图嵌入方法不一定都基于自编码器结构,也可能采用其他技术和模型。

通过图嵌入,你可以获得每个节点或边的低维表示,这些表示在向量空间中保留了网络的结构信息。这样的表示可以用于多种任务,例如:

  1. 节点分类: 将节点映射到低维空间后,可以在该空间中执行节点分类任务,例如确定节点所属的类别或标签。

  2. 链接预测: 通过节点之间的低维表示,可以预测网络中可能存在的链接或边。

  3. 图分类: 将整个图映射到低维空间,使得图的结构信息得以保留,可以用于图分类任务,例如判断图的类型或属性。

  4. 可视化: 通过在低维空间中表示网络,可以将网络结构可视化,帮助理解网络的拓扑结构。

图嵌入的方法包括诸如 DeepWalk、node2vec、GraphSAGE、Graph Convolutional Networks (GCN) 等。这些方法可以应用于不同类型的网络数据,包括社交网络、生物网络、知识图谱等。

Graph Convolutional Networks (GCN) 是一种用于图结构数据的深度学习模型,最早由Kipf和Welling于2017年提出。GCN的目标是学习节点在图中的表示,使得节点的表示能够捕捉其邻居节点的信息,从而有效地处理图结构的任务,如节点分类、图分类、链路预测等。

以下是GCN的基本原理和关键概念:

1. 图表示:

  • 节点表示: 图中的每个节点表示一个实体,可以是用户、物品、论文等。

  • 边表示: 图中的边表示节点之间的关系,可以是有向边或无向边。

2. 邻接矩阵(Adjacency Matrix):

  • GCN使用邻接矩阵来表示图的拓扑结构。对于图 (G),邻接矩阵 (A) 的元素 (A_{ij}) 表示节点 (i) 和节点 (j) 之间是否存在边。

3. 图卷积层(Graph Convolutional Layer):

  • 图卷积操作: GCN通过图卷积操作来更新节点的表示。一个单层GCN的更新规则可以表示为 (H' = f(\hat{D}^{-\frac{1}{2}}\hat{A}\hat{D}^{-\frac{1}{2}}XW)),其中 (H') 是更新后的节点表示,(\hat{A}) 是对称归一化的邻接矩阵,(\hat{D}) 是对角度矩阵,(X) 是节点特征矩阵,(W) 是权重矩阵,(f) 是激活函数。

  • 多层GCN: 多层GCN模型通过堆叠多个图卷积层,逐渐聚合更多的上下文信息,提高节点表示的表达能力。

4. 激活函数和损失函数:

  • 激活函数: 通常使用ReLU等激活函数。

  • 损失函数: 对于监督学习任务,如节点分类,通常使用交叉熵损失函数。

5. 训练过程:

  • 通过已知的节点标签进行监督学习。通过反向传播和梯度下降等优化算法,迭代地更新模型的参数。

6. 应用:

  • GCN广泛应用于图结构数据的任务,如社交网络分析、生物信息学、知识图谱等。

GCN的提出填补了传统卷积神经网络(CNN)在处理图结构数据上的不足,使得深度学习模型能够更好地理解和利用图数据的结构信息。虽然GCN是一种成功的模型,但后续也出现了一些改进版本,如GraphSAGE、GAT(Graph Attention Network)等,以应对不同类型的图数据和任务。

三、基于PyTorch的GCN实现的示例代码

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optimclass GraphConvolutionLayer(nn.Module):def __init__(self, input_dim, output_dim):super(GraphConvolutionLayer, self).__init__()self.linear = nn.Linear(input_dim, output_dim)def forward(self, adjacency_matrix, node_features):# 对邻接矩阵进行对称归一化row_sum = adjacency_matrix.sum(1, keepdim=True)normalized_adjacency = adjacency_matrix / row_sum# 执行图卷积操作result = torch.matmul(normalized_adjacency, node_features)result = self.linear(result)result = F.relu(result)return resultclass GCN(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(GCN, self).__init__()self.gc1 = GraphConvolutionLayer(input_dim, hidden_dim)self.gc2 = GraphConvolutionLayer(hidden_dim, output_dim)def forward(self, adjacency_matrix, node_features):h1 = self.gc1(adjacency_matrix, node_features)h2 = self.gc2(adjacency_matrix, h1)return h2# 示例数据
# 假设有一个简单的无向图,邻接矩阵表示为:
# adjacency_matrix = [[0, 1, 1],
#                    [1, 0, 1],
#                    [1, 1, 0]]
adjacency_matrix = torch.tensor([[0, 1, 1],[1, 0, 1],[1, 1, 0]], dtype=torch.float32)# 假设每个节点有一个特征,表示为:
# node_features = [[1, 2],
#                  [3, 4],
#                  [5, 6]]
node_features = torch.tensor([[1, 2],[3, 4],[5, 6]], dtype=torch.float32)# 创建GCN模型
input_dim = node_features.size(1)
hidden_dim = 16
output_dim = 2
gcn_model = GCN(input_dim, hidden_dim, output_dim)# 模型前向传播
output = gcn_model(adjacency_matrix, node_features)
print("GCN Output:\n", output)

 这只是一个简单的示例,实际中可能需要根据任务和数据的不同进行更复杂的模型设计和训练过程。此外,对于更大规模的图数据,可能需要使用图采样等技术以提高训练效率。

在GCN链路预测中,这可以通过以下步骤实现:

  1. 生成正样本和负样本: 从图中已有的边中随机选择一部分作为正样本,然后从图中不存在的边中随机选择相同数量的边作为负样本。

  2. 定义损失函数: 使用二元交叉熵损失函数,对模型输出的概率进行损失计算。

  3. 训练模型: 使用已有的正样本和负样本进行监督学习,迭代地更新模型的参数。

import torch
import torch.nn as nn
import dgl
import dgl.function as fn
import torch.optim as optim
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split# 构建一个简单的GCN模型
class GCN(nn.Module):def __init__(self, in_feats, hidden_size, out_feats):super(GCN, self).__init__()self.layer1 = GraphConvolution(in_feats, hidden_size)self.layer2 = GraphConvolution(hidden_size, out_feats)def forward(self, g, features):x = torch.relu(self.layer1(g, features))x = self.layer2(g, x)return x# 图卷积层的定义
class GraphConvolution(nn.Module):def __init__(self, in_feats, out_feats):super(GraphConvolution, self).__init__()self.linear = nn.Linear(in_feats, out_feats)def forward(self, g, features):with g.local_scope():g.ndata['h'] = featuresg.update_all(fn.copy_src(src='h', out='m'),fn.sum(msg='m', out='h_neigh'))h_neigh = g.ndata['h_neigh']return self.linear(h_neigh)# 数据加载和预处理
# 这里假设你有一个邻接矩阵`adjacency_matrix`和节点特征矩阵`features_matrix`,以及一个标签向量`labels`
# 请根据你的数据格式进行调整# 构建图
graph = dgl.graph(adjacency_matrix)
features = torch.tensor(features_matrix, dtype=torch.float32)
labels = torch.tensor(labels, dtype=torch.float32)# 划分训练集和测试集
train_mask, test_mask = train_test_split(range(len(labels)), test_size=0.2, random_state=42)# 初始化模型、损失函数和优化器
model = GCN(features.shape[1], 16, 1)
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)# 训练模型
for epoch in range(100):model.train()logits = model(graph, features)loss = criterion(logits[train_mask], labels[train_mask].view(-1, 1))optimizer.zero_grad()loss.backward()optimizer.step()# 计算AUCwith torch.no_grad():model.eval()pred_probs = torch.sigmoid(logits[test_mask]).numpy()auc = roc_auc_score(labels[test_mask].numpy(), pred_probs)print(f'Epoch {epoch + 1}, Loss: {loss.item():.4f}, AUC: {auc:.4f}')# 链路预测结果
model.eval()
logits = model(graph, features)
pred_probs = torch.sigmoid(logits).detach().numpy()

 关于复杂网络建模,我前面写了很多,大家可以学习参考。

【复杂网络建模】——常用绘图软件和库_图论画图软件

【复杂网络建模】——Pytmnet进行多层网络分析与可视化

【复杂网络建模】——Python通过平均度和随机概率构建ER网络

【复杂网络建模】——通过图神经网络来建模分析复杂网络

【复杂网络建模】——Python可视化重要节点识别(PageRank算法)

【复杂网络建模】——基于Pytorch构建图注意力网络模型

【复杂网络建模】——Hypergraphx: 用于高阶网络分析的库

【复杂网络建模】——基于节点相似性的社团划分算法

【复杂网络建模】——链路预测算法及其应用

 【复杂网络建模】——ER网络度分布、无标度网络度分布

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

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

相关文章

【C语言】7-32 刮刮彩票 分数 20

7-32 刮刮彩票 分数 20 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示: 每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9&#xf…

排序-插入排序与希尔排序

文章目录 一、插入排序二、希尔排序 一、插入排序 思路: 当插入第i(i>1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将…

基于Springboot+mybatis+mysql+jsp招聘网站

基于Springbootmybatismysqljsp招聘网站 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型:Java EE项目 项目名称:基于SPringBoot的照片网站 项目架构:B/S架构 开发语言:Java语言 前端技术&…

Swagger Array 逐步解密:带你简化开发工作

Swagger 允许开发者定义 API 的路径、请求参数、响应和其他相关信息,以便生成可读性较高的文档和自动生成客户端代码。而 Array (数组)是一种常见的数据结构,用于存储和组织多个相同类型的数据元素。数组可以有不同的维度和大小&a…

轨道电流检测IC——FP355,助力蓄电池充电器、SPS(适配器)、电池管理系统、多口快充充电器的优雅升级

目录 一、FP355概述 二、FP355特点 三、FP355应用 随着移动设备的普及和人们对电力需求的不断增长,充电器的安全性和充电效率成为了重要的关注点。 作为一种能够精确检测电流的集成电路,轨道电流检测IC——FP355是个不错的选择。它不仅广泛应用于蓄电…

SpringBoot集成Spring Security+jwt+kaptcha验证(简单实现,可根据实际修改逻辑)

参考文章 【全网最细致】SpringBoot整合Spring Security JWT实现用户认证 需求 结合jwt实现登录功能,采用自带/login接口实现权限控制 熟悉下SpringSecurity SpringSecurity 采用的是责任链的设计模式,是一堆过滤器链的组合,它有一条很…

03_W5500TCP_Client

上一节我们完成了W5500网络的初始化过程,这节我们进行TCP通信,w5500作为TCP客户端与电脑端的TCP_Server进行通信。 目录 1.TCP通信流程图: tcp的三次握手: tcp四次挥手: 2.代码分析: 3.测试&#xff1a…

Python游戏测试工具自动化遍历游戏中所有关卡

场景 游戏里有很多关卡(可能有几百个了),理论上每次发布到外网前都要遍历各关卡看看会不会有异常,上次就有玩家在打某个关卡时卡住不动了,如果每个关卡要人工遍历这样做会非常的耗时,所以考虑用自动化的方…

AI专题报告:2022年中国人工智能产业研究报告

今天分享的AI系列深度研究报告:《AI专题报告:2022年中国人工智能产业研究报告》。 (报告出品方:艾瑞咨询) 报告共计:112页 人工智能参与社会建设的千行百业 价值性、通用性、效率化为产业发展战略方向 …

淘宝API接口系列丨商品详情数据接口丨关键词搜索商品列表接口丨商品评论,销量接口

要对接淘宝API接口,可以按照以下步骤进行操作: 注册成为淘宝开放平台开发者,并创建一个应用。在应用创建页面,需要填写应用的名称、描述等信息,并设置应用的API权限等级。获取App Key和App Secret。在应用创建后&…

jira创建用例,与任务关联

项目用的jira,但之前的用例放在禅道上,或者归档于svn,都不是很好用,所以研究了下jira的用法 1、下载插件: synapseRT - Test management and QA in JIRA 完成后在tab会多出一个test 2、常用的功能 1、建立用例&#…

Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes

文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…

验证码的多种生成策略

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 第一种 a.导入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

zxjy003- Spring Cloud后端工程搭建

1、创建 sprigboot 工程 guli-parent groupId &#xff1a; com.atguigu artifactId &#xff1a; guli-parent 2.删除src目录 3.配置pom.xml 修改版本为 &#xff1a;2.2.1.RELEASE<artifactId> 节点后面添加 pom类型 全部依赖&#xff0c;复制下面的即可&#xff0c…

素材创作平台,解决企业素材供给问题

企业对于高质量素材的需求日益增长。无论是为了提升品牌形象&#xff0c;还是为了推动产品销售&#xff0c;都需要大量的专业设计素材。然而&#xff0c;素材的获取、设计和定制往往是一项耗时耗力的工作。这时&#xff0c;美摄科技素材创作平台应运而生&#xff0c;为企业提供…

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

ScreenCap---Version&#xff1a;001 说明 从0到1&#xff0c;手把手带你开发windows端的截屏软件ScreenCap 当前版本&#xff1a;ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 支持拖拽截图 支持保存全屏截图 支持另存截图到其他位置 GitHub 仓库master下的Scr…

C++新经典模板与泛型编程:用成员函数重载实现std::is_convertible

用成员函数重载实现is_convertible C标准库中提供的可变参类模板std::is_convertible&#xff0c;这个类模板的主要能力是判断能否从某个类型隐式地转换到另一个类型&#xff0c;返回的是一个布尔值true或false。例如&#xff0c;一般的从int转换成float或从float转换成int&am…

使用Plex结合cpolar搭建本地私人媒体站并实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

剧本杀小程序搭建:打造线上剧本杀新体验

剧本杀是一款以角色扮演为主的游戏&#xff0c;一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下&#xff0c;剧本杀规模也迅速上升。今年第一季度&#xff0c;剧本杀市场规模环比增长47%&#xff0c;市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展&#xff…

echarts绘制一个环形图2

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个柱状图&#xff0c;柱状折线图 echarts绘制一个饼图 效果&#xff1a; 组件代码&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…