Karateclub包介绍及节点嵌入实现

之前多次谈到一个包,就是 karateclub,这个包囊括了很多社区检测算法和节点嵌入算法,今天专门介绍一下这个包如何使用。

算法分类

这里面将所有方法分成了七类,前两类是社区检测方法,中间四类是节点嵌入方法,最后一类是整图嵌入方法。
在这里插入图片描述

我整理了一下这个包中收录的各种方法,如下图所示。

# Overlapping community detection 重叠社区检测方法
EgoNetSplitter, DANMF, NNSED, MNMF, BigClam, SymmNMF

# Non-overlapping community detection 非重叠社区检测方法
GEMSEC, EdMot, SCD, LabelPropagation

# Neighbourhood-based node embedding 基于邻域的节点嵌入方法
RandNE, DeepWalk, Node2Vec, Walklets, BoostNE, NodeSketch, 
Diff2Vec, GEMSEC, NetMF, GraRep, NMFADMM, LaplacianEigenmaps

# Structural node embedding 基于结构的节点嵌入方法
GraphWave, Role2Vec

# Attributed node embedding 基于属性的节点嵌入方法
FeatherNode, MUSAE, SINE, BANE, TENE, TADW, FSCNMF, ASNE

# Meta node embedding 源节点嵌入方法
 NEU

# Whole graph embedding 整图嵌入方法
 LDP, FeatherGraph, IGE, GeoScattering, GL2Vec, NetLSD, SF, FGSD, Graph2Vec

注意,karateclub包中的节点嵌入算法都对图的连通性有要求,必须是连通图才能进行节点嵌入,否则会报错。

节点嵌入

下面具体介绍一下,如何使用这个包中的算法。

DeepWalk

以节点嵌入为例,我们先用一下其中最经典的DeepWalk算法。

import networkx as nx
import networkx.algorithms.community as nx_comm
from karateclub import DeepWalk
from sklearn.cluster import KMeans

G = nx.karate_club_graph() 
model = DeepWalk()   # model
model.fit(G)    # node embedding
G_embedding = model.get_embedding()

# clustering by kmeans
num_coms = 2  # number of clusters
clusters = KMeans(n_clusters=num_coms).fit_predict(G_embedding)
print(clusters)

communities = []
for i in range(num_coms):
    communities.append(set())
    
for i in range(len(clusters)):
    communities[clusters[i]].add(i)
print(communities)

mod = nx_comm.modularity(G, communities)
print('The modularity of karate club graph is {:.4f}'.format(mod))

我们先对karate_club_graph进行了节点嵌入操作,然后利用KMeans算法对嵌入结果进行聚类,这里设置为2类,之后将聚类结果转化为社区检测结果,然后计算出模块度值,结果如下所示。

[1 1 0 1 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
[{32, 33, 2, 8, 9, 13, 14, 15, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, {0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 16, 17, 19, 21}]
The modularity of karate club graph is 0.3352

接下来,我们可视化一下社区检测结果。

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10, 6))
pos = nx.spring_layout(G) 
nx.draw_networkx(G, pos, with_labels=True)
colors = ['#483D8B', '#00CED1', '#FF4500', '#FFD700']
for i in range(num_coms):
    nx.draw_networkx_nodes(G, pos, node_size=700, nodelist=list(communities[i]), node_color=colors[i])
nx.draw_networkx_edges(G, pos, alpha=0.5, width=2)
plt.axis("off")
plt.show()

效果如下:

在这里插入图片描述

Node2Vec

我们再试试Node2Vec算法,这是对DeepWalk的一个改进算法。

只需要将上面代码中的DeepWalk换成Node2Vec就行,这次我们将聚类个数设置为3。

import networkx as nx
import networkx.algorithms.community as nx_comm
from karateclub import DeepWalk, Node2Vec
from sklearn.cluster import KMeans

G = nx.karate_club_graph()
model = Node2Vec()   # model
model.fit(G)
G_embedding = model.get_embedding()

# clustering by kmeans
num_coms = 3
clusters = KMeans(n_clusters=num_coms).fit_predict(G_embedding)
print(clusters)

communities = []
for i in range(num_coms):
    communities.append(set())
    
for i in range(len(clusters)):
    communities[clusters[i]].add(i)
print(communities)

mod = nx_comm.modularity(G, communities)
print('The modularity of karate club graph is {:.4f}'.format(mod))

这次结果为:

[1 1 0 1 2 2 2 1 0 0 2 1 1 1 0 0 2 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0]
[{32, 33, 2, 8, 9, 14, 15, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, {0, 1, 3, 7, 11, 12, 13, 17, 19, 21}, {4, 5, 6, 10, 16}]
The modularity of karate club graph is 0.3744

可以看到,模块度值比上次要高一些(前面是0.3352),再看看社区检测效果。

在这里插入图片描述

总结

在这篇文章里面,我们只是利用了karateclub 包中的节点嵌入算法,参数都是默认参数,然后再用聚类算法对节点进行分类,而不是将嵌入结果直接作为社区检测的结果。实际上我们可以将嵌入算法最后的输出维度设置为2维,这样可以直接看到节点低维嵌入的效果,参考之前的文章。

PyTorch图神经网络实践(四)Node2Vec节点分类及其可视化

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
数据中,每个节点通常由一个向量表示。节点嵌入(Node Embedding)是将每个节点映射到一个低维向量空间中的过程,这个向量通常被称为节点嵌入向量。节点嵌入的目的是为了将数据中的节点转化为向量,以便于进行机器学习任务,如节点分类、链接预测等。 GNN(Graph Neural Network)是处理数据的一种神经网络模型,它可以对中的节点和边进行表示学习。在GNN中,节点嵌入是一个重要的任务。GNN通过对节点嵌入进行学习,可以实现结构的理解和节点分类等任务。 节点嵌入是通过一系列的转换函数从原始节点特征向量中生成的。在GNN中,节点嵌入的生成过程通常涉及到对邻居节点的信息聚合。在每一层中,GNN会根据每个节点的邻居节点信息来更新节点嵌入向量,以此将邻居节点的信息融入到当前节点嵌入向量中。 GNN中的节点嵌入通常含多个维度,每个维度对应一种特征。这些特征可以是节点的基本特征,如节点的ID、度数等,也可以是节点的高级特征,如节点的社交属性、语义特征等。节点嵌入的生成过程通常采用迭代的方式,每次迭代都会更新节点嵌入向量,直到收敛。 总之,节点嵌入是将中的节点映射到低维向量空间中的过程,它是GNN中的一个重要任务。节点嵌入的生成通常涉及到邻居节点信息聚合,其目的是将邻居节点的信息融入到当前节点嵌入向量中,以便于进行机器学习任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值