如何使用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 生成的图上学习的光谱聚类

可以使用 python 3 从 networkx 获取分层图吗?

networkx之图遍历和图绘制

使用默认为节点名称的节点标签绘制 networkx 图

如何在 Python 中重塑 networkx 图?