“R”中图聚类的方法和示例

机器算法验证 r 聚类 数据可视化 数字
2022-03-10 19:33:54

我正在寻找使用“r”中的图形聚类对图形中的节点进行分组/合并。

这是我的问题的一个惊人的玩具变体。

  • 有两个“集群”
  • 有一座连接集群的“桥梁”

这是一个候选网络:
在此处输入图像描述

当我查看连接距离时,“跳数”,如果你愿意,那么我可以得到以下矩阵:

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

这里的想法:

  • 幸运的是或者由于玩具的简单性,矩阵有明显的补丁,这在(非常大的)矩阵中不会出现这种情况。如果我将点和行之间的关系随机化,那么它就不会那么干净了。
  • 我可能弄错了——所以如果我有错别字,请告诉我。
  • 这里的跳数是连接第 i 行上的点和第 j 列上的点的最短跳数。自跳仍然是一跳,所以对角线都是一。

所以在这个矩阵中,更大的距离(跳数)有更大的数字。如果我想要一个显示“连通性”而不是距离的矩阵,那么我可以做一个点逆,其中矩阵的每个单元格都被它的乘法逆替换。

问题:

为了帮助我找到自己的方式:

  • 通过组合它们来减少图上节点数量的术语是什么?是集群、合并、混合——我应该使用什么词?
  • 有哪些经过验证的技术?有没有关于这个主题的教科书?你能指出论文或网站吗?
  • 现在我试着先看这里——这是一个很棒的“第一次检查”点。我没有找到我要找的东西。如果我错过了(并非不可能),您能否指出我在 CV 上就该主题回答的一两个问题?

为了让我去我要去的地方:

  • 是否有一个“R”包可以正确地集群网络上的节点?
  • 你能指出我的示例代码来做到这一点吗?
  • 是否有一个“R”包可以以图形方式呈现由此产生的缩减网络?
  • 你能指出我的示例代码来做到这一点吗?

提前致谢。

3个回答

您的特定示例建议在网络中找到社区中的节点之间具有更多连接且不同社区中的节点之间的边相对较少的社区。这与寻找孤立的社区不同,其中有完全断开的子图。

这是使用igraph包和Clauset 等人描述的算法在 R 中进行社区检测的示例。(2004 年)要使用此算法,我将您的“跳数”转换为没有自循环的二进制邻接矩阵。该算法需要一个无向矩阵,它与您的手写图表和您提供的数据一致(边缘是对称的)。

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

在此处输入图像描述

我无法评论折叠此类节点以进行进一步分析的适当性,但此类社区检测对于探索网络绝对有用。还有许多其他社区检测算法(以及 R 中用于网络分析的其他库)。这只是恰好为这个玩具问题产生所需输出的一个示例。

对于未来的读者,

这是 igraph 包中的一组函数,最后一个来自 MCL:

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

您可以在此处找到文档http://igraph.org/r/doc/和此处https://cran.r-project.org/web/packages/MCL/MCL.pdf

我发现 walktrap 特别有用

如果您还没有绑定到节点和连接数据的存储库,您可能会查看 Rneo4j 包。但这意味着使用 neo4j(图形数据库,而不是 RDBMS)来存储您的数据。我不是这里的专家,但我确实认为这种方法可能特别有效,如果 a) 如 Anony-Mousse 所建议的那样,您无法将其形式化,或者 b) 节点和连接的数量特别大,或者 c) 你会发疯有关于您的网络的其他问题。