问题描述
在igraph中,应用于集群算法的“比较”命令与其应用于集群成员资格的命令之间有什么区别。
作为州手册页:
compare (sg,le,method = "rand")
compare (membership (sg),membership (le))
解决方法
我阅读了compare
的文档,格式为:
compare(comm1,comm2,method = c("vi","nmi","split.join","rand","adjusted.rand"))
comm1
和comm2
的文档中提到以下内容:
comm1 :包含社区结构的社区对象;或数字向量,第一个社区结构的隶属度向量。隶属度矢量应包含每个顶点的社区ID,社区的编号从1开始。
最后提到的完整代码是
g <- make_graph("Zachary")
sg <- cluster_spinglass(g)
le <- cluster_leading_eigen(g)
compare(sg,le,method="rand")
compare(membership(sg),membership(le))
现在是第一种情况:
compare(sg,method="rand")
sg
和le
本身就是群集对象,即它们分别是community detection via spin-glass model和community detetection by calculating the leading non-negative eigenvector of the modularity matrix of the graph的结果。简而言之,两者都包含数据的社区结构。
现在是第二种情况:
compare(membership(sg),membership(le))
这使用membership
来执行以下操作:
成员资格将顶点划分为社区。它返回一个数字矢量,每个顶点一个值,即其社区的ID。社区ID从1开始。请注意,有些算法会计算社区的完整(或不完整)层次结构,而不仅仅是单个分区。对于这些算法,通常会返回最高模块化值的成员身份,但另请参见各个算法的手册页
您可以阅读有关功能here的更多信息。
如您所见,这将返回一个数字矢量,其中包含每个顶点的成员资格信息,这是comm1
函数的comm2
和compare
参数中允许的第二种类型的值
因此,两个语句本质上是相同的。它们只是完成同一件事的不同方式。
如果运行文档末尾给出的代码,则会看到以下内容:
> g <- make_graph("Zachary")
> sg <- cluster_spinglass(g)
> le <- cluster_leading_eigen(g)
> compare(sg,method="rand")
[1] 0.9500891
> compare(membership(sg),membership(le))
[1] 0.2765712
结果的差异是因为在第一次调用中method
属性被设置为rand
。如果您在第二个调用中也分配了method
属性,则会看到完全相同的结果:
> g <- make_graph("Zachary")
> sg <- cluster_spinglass(g)
> le <- cluster_leading_eigen(g)
> compare(sg,membership(le),method="rand")
[1] 0.9500891
如您所见,两者都提供相同的结果。
参考: