使用 scikit 在通过 networkx 生成的图上学习的光谱聚类

Posted

技术标签:

【中文标题】使用 scikit 在通过 networkx 生成的图上学习的光谱聚类【英文标题】:Spectral clustering using scikit learn on graph generated through networkx 【发布时间】:2014-07-04 06:50:12 【问题描述】:

我有一个 3000x50 的特征向量矩阵。我使用sklearn.metrics.pairwise_distances 作为“Similarity_Matrix”获得了一个相似度矩阵。现在我使用networkx 使用上一步中生成的相似矩阵G=nx.from_numpy_matrix(Similarity_Matrix) 创建了一个图形。我现在想在这个图G 上执行光谱聚类,但是几个谷歌搜索未能提供一个像样的 scikit 在这个图上学习光谱聚类的例子:( 官方文档显示了如何对一些图像数据进行光谱聚类至少对于像我这样的新手来说非常不清楚。

谁能给我一个代码示例,或者使用 networkx、scikit learn 等进行图形切割或图形分区。

谢谢一百万!

【问题讨论】:

pairwise_distances 产生一个 distance 矩阵,但您需要一个 similarity 矩阵(内核的 Gram 矩阵)。我不明白你为什么也把 NetworkX 放在循环中。 感谢您的回复。为了执行谱聚类,我被告知要以图表的形式转换数据。因此,我为此使用networkx。欢迎提出其他想法。 图形在 scikit-learn 中表示为连接矩阵。 scikit-learn 不与 NetworkX 对话。 【参考方案1】:

adj_matrix = nx.from_numpy_matrix 将帮助您创建一个邻接矩阵,这将是您的亲和矩阵。您需要像这样将其提供给 scikit-learn:SpectralClustering(affinity = 'precomputed', assign_labels="discretize",random_state=0,n_clusters=2).fit_predict(adj_matrix)

如果您没有任何相似度矩阵,您可以将 'affinity' 参数的值更改为 'rbf' 或 'nearest_neighbors'。下面的示例解释了整个光谱聚类管道:

import sklearn
import networkx as nx
import matplotlib.pyplot as plt

'''Graph creation and initialization'''
G=nx.Graph()
G.add_edge(1,2)  # default edge weight=1
G.add_edge(3,4,weight=0.2) #weight represents edge weight or affinity
G.add_edge(2,3,weight=0.9) 
G.add_edge("Hello", "World", weight= 0.6)

'''Matrix creation'''
adj_matrix = nx.to_numpy_matrix(G) #Converts graph to an adj matrix with adj_matrix[i][j] represents weight between node i,j.
node_list = list(G.nodes()) #returns a list of nodes with index mapping with the a 

'''Spectral Clustering'''
clusters = SpectralClustering(affinity = 'precomputed', assign_labels="discretize",random_state=0,n_clusters=2).fit_predict(adj_matrix)
plt.scatter(nodes_list,clusters,c=clusters, s=50, cmap='viridis')
plt.show()

【讨论】:

以上是关于使用 scikit 在通过 networkx 生成的图上学习的光谱聚类的主要内容,如果未能解决你的问题,请参考以下文章

python-networkx学习

Cytoscape结合Networkx生成有向图

Cytoscape结合Networkx生成有向图

如何使用 python 的 networkx 模块从节点列表生成完全连接的子图

使用networkX输出树形结构

如何使用Python的networkx模块来生成节点列表完全连通子图