如何使用networkx图作为sklearn的输入
Posted
技术标签:
【中文标题】如何使用networkx图作为sklearn的输入【英文标题】:How to use networkx graphs as input for sklearn 【发布时间】:2019-08-31 03:51:55 【问题描述】:我想应用 sklearn 图聚类算法,但它们不接受来自 networkx 的 .gexf 格式的输入。我需要什么样的库/转换才能使我的 .gexf 图适合 sklearn?
【问题讨论】:
您要应用哪种聚类算法? networkx 有一些聚类算法,例如实现了 k-最近邻 networkx.github.io/documentation/networkx-1.9.1/reference/… 我想使用 Affinity Propagation 和 Spectral Clustering。不是 networkx 库中包含的聚类算法 @Mnemosyne 你看过这里***.com/questions/46258657/… 吗? 【参考方案1】:聚类算法接受距离矩阵、亲和矩阵或特征矩阵。例如,kmeans 将接受一个特征矩阵(例如,m 维的 n 个点中的 X)并应用欧几里德距离度量,而亲和力传播接受一个亲和力矩阵(即 nxn 维的方阵 D)或特征矩阵(取决于亲和力参数)。
如果您想应用 sklearn(或只是非图)集群算法,您可以 extract adjacency matrices from networkx graphs。
A = nx.to_scipy_sparse_matrix(G)
我想你应该确定,你的对角线是 1;如果没有,请numpy.fill_diagonal(D, 1)
。
这样就只剩下应用聚类算法了:
from sklearn.cluster import AffinityPropagation
ap = AffinityPropagation(affinity='precomputed').fit(A)
print(ap.labels_)
如果您想应用其他算法,甚至将邻接/距离矩阵投影到特征矩阵,也可以将邻接矩阵转换为距离矩阵。
要完成所有这些操作就太过分了,但是,对于获取距离矩阵,如果您有二元边,则可以使用D = 1 - A
;如果你有加权边缘,你可以D = A.max() - A
。
【讨论】:
以上是关于如何使用networkx图作为sklearn的输入的主要内容,如果未能解决你的问题,请参考以下文章
使用 scikit 在通过 networkx 生成的图上学习的光谱聚类