“Weisfeiler-Lehman Neural Machine for Link Prediction“文章复现工作

1 复现文章:

  • 《Weisfeiler-Lehman Neural Machine for Link Prediction》

2 文章提出的方法思路:

  • 笔者希望能够通过提取目标连边的周围连边所构成的子图,并通过一种编码方法,保留住每个节点在子图中扮演的不同角色,即在不同子图当中扮演相同角色的节点能够有相近的编号。如下面两张图所示,在两个不同的子网络当中,扮演角色相同的节点会得到相同的编号。

Fig.1
在这里插入图片描述

  • 然后笔者要对于网络中的每一条连边生成这样的一张子图,然后将子图都转化为对应的邻接矩阵,输入到一个机器学习分类模型(文章中用到的是单个隐藏层的神经网络)当中进行训练。

3 难点:

  • 如何对于不同的子图当中的节点进行编码,并保证其能够保存节点的相对角色?

4 解决:

  • 笔者的思路就是,首先将一个连边所对应的两个节点的一阶、二阶…邻居节点提取出来,然后根据一个笔者提出的哈希函数对节点进行排序,大致流程如下:其做法为:首先根据子图中的节点与目标连边所连接的两个节点之间的距离初始化节点的标签,然后开始迭代,每次迭代,计算每个节点的哈希值,然后根据哈希值来更新该节点的标签,其中哈希值最小的编码为1,第二小的为2,若有相同取值的就分配到同样的数字。
    在这里插入图片描述
    哈希函数为:
    在这里插入图片描述
    其中 P ( n ) P(n) P(n)为第n个素数。

5 文章提出方法的流程图:

  • 整个算法的基本流程:首先对于每一条连边,提取K个以上邻居节点构成的子图。提取顺序是:先一阶邻居,再二阶邻居…;接着对提取的子图进行图编码,然后选择前K个进行提取。提取完子图之后为每个节点建立一个上三角邻接矩阵,将邻接矩阵输入到神经网络中进行学习。
    在这里插入图片描述

6 代码:

6.1 首先导入所需库
import networkx as nx
import numpy as np
import pandas as pd
import math
import random
import matplotlib.pyplot as plt
import scipy
from scipy.io import loadmat
from functools import partial
from sklearn import svm
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
from sklearn import metrics
6.2 载入数据,构建网络及可视化
data = loadmat('./USAir.mat')
G = nx.from_numpy_matrix(data['net'].todense(),create_using=nx.Graph()) #构建网络
print(nx.info(G))
pos=nx.spring_layout(G)
plt.figure(figsize=(10,8))
nx.draw(G,pos=pos,node_size=50,alpha=0.5,with_labels=False)
plt.title('USAir Network',fontsize=16,fontweight='bold')
plt.show()
  • 结果:
    在这里插入图片描述
    在这里插入图片描述
6.3 正采样
G_train = G.copy() 
G_test = nx.empty_graph(G_train.number_of_nodes())
n_links = int(G_train.number_of_edges()) # 获得网络中的连边总数

ratio = 0.1 #取10%的连边作为测试集连边
n_test_link = int(np.ceil(n_links*ratio))
print(n_test_link)
selected_link_id = np.random.choice(np.arange(n_links),size=n_test_link,replace=False)
adj_matrix = nx.adj_matrix(G)
adj_matrix = scipy.sparse.triu(adj_matrix,k=1)
rol,col = adj_matrix.nonzero() #取非零元素
links = [(i,j) for i,j in zip(rol,col)]
selected_links = []
for link_id in selected_link_id:
    selected_links.append(links[link_id]) #根据连边的索引获得连边
G_train.remove_edges_from(selected_links)
G_test.add_edges_from(selected_links)
pr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值