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


10

我正在寻找使用'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列的点的最短跳数。自跳仍然是跳,因此对角线全为跳。

因此,在此矩阵中,较大的距离(跳跃数)具有较高的数字。如果我想要一个显示“连通性”而不是距离的矩阵,那么我可以做一个点逆,将矩阵的每个像元都替换为其乘性逆。

问题:

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

  • 通过组合它们来减少图上节点数的术语是什么?它是集群,合并,纠结吗?我应该使用什么词?
  • 有哪些成熟的技术?是否有关于该主题的教科书?您可以指向论文或网站吗?
  • 现在,我尝试首先看一下这里-这是一个不错的“首次检查”地点。我没有找到想要的东西。如果我错过了(不是不太可能),您能给我指出关于简历的一个或两个有关该主题的问题吗?

要带我去哪里:

  • 是否有一个“ R”包可以正确群集网络上的节点?
  • 您能指出我要执行此操作的示例代码吗?
  • 是否有一个“ R”包可以图形化地显示缩小后的网络?
  • 您能指出我要执行此操作的示例代码吗?

提前致谢。


2
请注意,此处要求(R)软件包或代码不在主题范围内。您可能希望使“查找”部分更加突出,而使“获取”部分更少。
gung-恢复莫妮卡

3
我会在有机会@gung的某个时候尝试做出完整的答案。但是为了快速回答,这里是使用R igraph软件包将社区检测应用于EngrStudent的示例图。
安迪W

1
恕我直言,此图中只有一个群集。但是,有三个重叠的集团。我不知道您的计划为何要破坏中间集团-除非您可以将其正式化,否则将很难找到算法。
退出了–Anony-Mousse 2015年

2
就其价值而言,mcl(micans.org/mcl)找到了两个聚类(我并不完全同意Anony-Mousse的评估,而且我也没有发现用于图聚类的集团建模方法特别富有成果)。这是将其单个参数(控制粒度)设置为默认值的情况。这种算法(我曾发表过mcl)已在生物信息学中广泛使用,并且(高度可扩展)源代码可用。使用文本接口可以轻松完成与R的接口。
micans,2015年

2
在这里,询问代码和程序包基本上总是不合时宜。使用现有代码(例如,您有一个可复制的示例)寻求帮助是Stack Overflow上的热门话题。如果您不知道这些,那么该学习它了。对SO回答R Q的用户没有统计学专业知识的想法对我来说很奇怪,但是许多人似乎认为是这样。无论如何,这是不正确的。SO帖子回答了您的Q,请在这里说些什么。OTOH说“这是什么样的分析,有人可以向我指出资源”绝对是这里的话题。
gung-恢复莫妮卡

Answers:


9

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

这是使用igraphPackage和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中用于网络分析的其他库)。这只是碰巧产生此玩具问题所需输出的一个示例。


1
同样,鉴于先前有关使用图形数据库的注释,您无需将图形表示为邻接矩阵。节点表和每个边缘行是一种更为典型/高效的格式,您可以将其转换为igraph网络。
安迪W

1

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


我不知道这样的事情存在。整齐!这是材料的一个很好的例子吗?nicolewhite.github.io/RNeo4j/examples
EngrStudent 2015年

从neo4j中的数据到图聚类又将如何?mcl或igraph可以使用吗?
EngrStudent 2015年

2
一旦将数据从neo4j提取到R中,就可以对数据使用任何其他R包(例如,AndyW建议igraph)。另外,Rneo4j软件包包括用于检索数据的命令,还允许您运行Cypher查询语言(类似于SQL,但是针对neo4j graph db定制的)。在Cypher中,您可以执行复杂的查询并运行一些预定义的算法(最短路径,所有路径,所有简单路径,Dijkstra等)。我在字符和内容上都受到限制-如果您想走这条路(对不起!),那么neo4j网站可能是您的下一站。
user3123116 2015年

1

对于未来的读者,

这是来自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上找到文档。

我发现手环特别有用


尽管这可能与问题有关,但这似乎不是答案。
Michael R. Chernick

2
我回答了两个问题:是否有一个“ R”包,可以正确地将网络上的节点群集?您能指出我要执行此操作的示例代码吗?但是是的,它不能回答所有问题。
奥马尔·贾福
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.