Karateclub包介绍及节点嵌入实现

本文介绍了karateclub库中的社区检测算法和节点嵌入方法,如DeepWalk和Node2Vec,展示了如何使用这些算法进行节点嵌入并进行聚类分析,以提高模块度和可视化社区结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前多次谈到一个包,就是 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节点分类及其可视化

好的,我明白了。针对你的问题,我可以给出以下建议: 1. 首先,你需要将你的数据集按照9:1的比例分成训练集和测试集。你可以使用sklearn库中的train_test_split函数来完成这个任务。具体操作如下: ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42) ``` 其中,X是你的特征矩阵,y是你的标签向量,test_size参数代表测试集占比,random_state参数用于保证每次划分数据集的结果都一致。 2. 然后,你需要使用ACT算法进行链路预测。ACT算法是一种基于随机游走的网络嵌入方法,可以将网络中的节点映射到低维向量空间中。你可以使用NetworkX库来构建网络,并使用karateclub库中的ACT算法来进行嵌入。具体操作如下: ```python import networkx as nx from karateclub import ACT # 构建网络 G = nx.Graph() G.add_edges_from(edges) # 嵌入节点 act = ACT(dimensions=100) # dimensions参数代表嵌入的向量维度 act.fit(G) # 获取嵌入结果 X = act.get_embedding() ``` 其中,edges是你的边列表,X是嵌入后的节点特征矩阵。 3. 最后,你可以使用嵌入结果来训练分类器,并计算AUC值和Precision。你可以选择SVM、LR、RF等分类器,并使用sklearn库中的相关函数来完成训练和评估。具体操作如下: ```python from sklearn.metrics import roc_auc_score, precision_score from sklearn.svm import SVC # 训练SVM分类器 clf = SVC(kernel='linear', C=1.0) clf.fit(X_train, y_train) # 预测测试集标签 y_pred = clf.predict(X_test) # 计算AUC值和Precision auc = roc_auc_score(y_test, y_pred) precision = precision_score(y_test, y_pred) ``` 其中,kernel参数代表SVM的核函数,C参数代表正则化强度,y_pred是使用训练好的分类器对测试集进行的预测。 希望这些信息能对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值