带权有向作业图聚类:如何将随机游走融入谱聚类模型?
问题解答
是否需要加入随机游走?
- 取决于当前谱聚类的效果:如果你的谱聚类结果和已知的
ClientSupport/Consulting两类作业的对应度很低,或者聚类结果无法反映实际的作业转移模式,那么加入随机游走是很有必要的。 - 原因:带权有向图的边权重是转移次数,随机游走(尤其是带偏随机游走)能模拟实际的作业转移路径,捕捉节点的结构相似性——比如两个作业如果频繁出现在同一条转移路径中,说明它们的业务关联更紧密,这种信息是单纯基于邻接矩阵的谱聚类无法完全捕捉的。
如何将随机游走接入Scikit-learn的SpectralClustering?
核心思路是:用随机游走序列训练节点嵌入,再基于嵌入构建亲和矩阵,最后传入SpectralClustering模型。具体步骤如下:
1. 用Word2Vec训练节点嵌入
基于你生成的weighted_walks,用Word2Vec学习每个作业节点的向量表示,这个向量能编码节点在转移路径中的结构信息:
# 将游走序列中的节点转换为字符串(Word2Vec要求输入为字符串序列) weighted_walks_str = [[str(node) for node in walk] for walk in weighted_walks] # 训练Word2Vec模型 model = Word2Vec( sentences=weighted_walks_str, vector_size=128, # 嵌入维度,可根据节点数量调整 window=5, min_count=1, sg=1, # 用Skip-Gram模式,更适合节点嵌入 workers=4, seed=1234 ) # 获取所有节点的嵌入向量,按节点顺序排列 node_ids = list(sg_graph.nodes()) node_embeddings = np.array([model.wv[str(node)] for node in node_ids])
2. 构建亲和矩阵并接入SpectralClustering
有两种可行方式:
方式一:基于嵌入的余弦相似度构建亲和矩阵
from sklearn.metrics.pairwise import cosine_similarity # 计算节点嵌入的余弦相似度作为亲和矩阵 affinity_mat = cosine_similarity(node_embeddings) # 传入SpectralClustering模型 sc = SpectralClustering( n_clusters=2, affinity="precomputed", n_init=100, assign_labels="kmeans", random_state=1234 ) sc.fit(affinity_mat) # 获取聚类结果,与节点一一对应 cluster_labels = dict(zip(node_ids, sc.labels_))
方式二:直接用嵌入作为特征(简化版)
SpectralClustering支持直接传入特征矩阵,此时将affinity设为"nearest_neighbors",模型会自动基于特征构建亲和矩阵:
sc = SpectralClustering( n_clusters=2, affinity="nearest_neighbors", n_init=100, assign_labels="kmeans", random_state=1234 ) sc.fit(node_embeddings) cluster_labels = dict(zip(node_ids, sc.labels_))
额外优化建议
- 调整Word2Vec参数:比如
vector_size(嵌入维度)、window(上下文窗口大小),可根据聚类效果微调。 - 验证随机游走参数:你设置的
p=5(高返回参数,减少重复访问起始节点)、q=0.05(低进出参数,更倾向于探索新节点),如果聚类结果不符合预期,可以尝试p=1、q=1的标准随机游走做对比。 - 对比效果:用已知的
sub_family_desc标签计算聚类准确率,判断加入随机游走后的效果是否优于原始谱聚类。
内容的提问来源于stack exchange,提问作者giuliano barbosa
相关产品推荐
相关产品推荐

