【复杂网络建模】——基于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 optim

class 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 result

class 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'] = features
            g.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()

    # 计算AUC
    with 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网络度分布、无标度网络度分布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker的资源控制:

docker的资源控制: 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制,记录,隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…

【动态规划】03斐波那契数列模型_最小花费爬楼梯_C++(easy1)

题目链接:leetcode使用最小花费爬楼梯 目录 题目解析: 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析: 题目让我们求达到楼梯顶部的最低花费. 由题可得: cost[i] 是从楼梯第 i 个…

【LeetCode刷题-树】--113.路径总和II

113.路径总和II 方法一:深度优先搜素 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

语音识别功能测试:90%问题,可以通过技术解决

现在市面上的智能电子产品千千万,为了达到人们使用更加方便的目的,很多智能产品都开发了语音识别功能,用来语音唤醒进行交互;另外,各大公司也开发出来了各种智能语音机器人,比如小米公司的“小爱”&#xf…

少儿编程考级:激发孩子逻辑思维能力的关键

在当今信息化时代,少儿编程已经成为孩子们不可或缺的一项技能。而少儿编程考级,则是检验孩子们在这一技能上所取得的成就的重要途径。少儿编程考级不仅能够激发孩子们的逻辑思维能力,还能够提高他们的动手能力和创造力。6547网将详细介绍少儿…

Windows Terminal的半透明效果

打开Windows Terminal的半透明效果 最终实现效果: 系统:win11 23H2 步骤: 1.winx打开终端 2.右键打开设置 3.打开外观->亚克力材料开启 4.默认值->外观->透明度,按喜好选择即可

使用opengl编写shader出现错误,提示无法创建片段shader,且提示:too much data in type constructor

最近在学opengl,在编写片段shader时,编译出现错误如下: 造成这个问题的原因是fragment shader的代码有问题,在创建片段着色器代码的第七行需要传入一些参数,如果传入参数的个数超过了规定值,就会报错。 解…

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

使用 VSCode 开发 Golang 代码,并支持 debug断点调试

背景 Go 自2012年发布至今,由于其出色的性能与并发处理能力,已经被各大互联网公司应用到成熟的产品服务上,目前本人从事项目的后端服务已经从Python全部切换到Go。 于是决定跟后端大佬系统的学习一下Golang语言,然后将自己学习过…

day3_qt

完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&#xf…

用户登录权限

文章目录 [TOC](文章目录) 前言一、鉴权二、 Cookie与session1.HTTP无状态2.cookie的重要属性3.cookie 和 session 的生命周期3.1 cookie 生命周期影响因素3.2 session 生命周期影响因素 4.cookie 和 session 的区别5.工作原理3 用户登录Node.js和Express验证session 三、JSON …

亿胜盈科ATR2037 无限射频前端低噪声放大器

亿胜盈科ATR2037 是一款应用于无线通信射频前端,工作频段为 0.7 到 6GHz 的超低噪声放大器。 ATR2037 低噪声放大器采用先进的 GaAs pHEMT 工艺设计和制作,ATR2037 低噪声放大器在整个工作频段内可以获得非常好的射频性能超低噪声系数。 亿胜盈科ATR203…

QML与C++之间自定义对象输出

1.定义暴露的C类 Message.h #ifndef MESSAGE_H #define MESSAGE_H#include "QObject" #include "MessageAuthor.h"class Message : public QObject {Q_OBJECTQ_PROPERTY(MessageAuthor* author READ author )public:explicit Message(QObject *parent nu…

多线程案例-阻塞队列

阻塞队列是什么 阻塞队列是一种特殊的队列.也遵循"先进先出"的原则 阻塞队列能是一种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续入队列就会阻塞,直到有其他线程从队列中取走元素. 当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插入元素…

LinuxC中进程通信

LinuxC中进程通信 信号(Signals):Linux 提供了信号机制,允许一个进程向另一个进程发送信号以通知特定事件的发生。这是一种轻量级的通信机制,通常用于处理异步事件。您可以使用 kill 命令或 kill 函数来发送信号&…

day16_java多线程(入门了解)

多线程入门 一、线程和进程 进程 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间和系统资源,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位&#xff1…

从这三个方面,可以快速分析光伏系统设计方案的可行性!

随着光伏技术的不断发展,光伏项目也越来越受欢迎。光伏发电是利用半导体界面的光生伏特效应而将光能直接转变为电能的一种技术。如何分析光伏系统设计方案的可行性? 1.经济可行性分析 需要考虑光伏系统的投资成本,包括太阳能电池板、逆变器…

Qt/QML编程学习之心得:工程中的文件(十二)

Qt生成了工程之后,尤其在QtCreator产生对应的project项目之后,就如同VisualStudio一样,会产生相关的工程文件,那么这些工程文件都是做什么的呢?这里介绍一下。比如产生了一个Qt Widget application,当然如果Qt Quick Application工程会有所不同。 一、.pro和.pro.user …

Java学习总结

1. Java集合体系框架 java.util中包含 Java 最常用的the collections framework。 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection 接口派生出了三个子接口List、Set、Queue。Map 接口 因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。 …

数据库常用锁

锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制,MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。 MySQL锁可以按模式分类为:乐观锁与悲观锁。 按粒度分可以分为全局锁、表级锁、页级…