;"比较";命令应用于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,社区的编号从一开始。
结尾提到的完整代码是
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, le, method="rand")
sg
和le
本身就是聚类对象,即它们分别是通过自旋玻璃模型进行群落检测和通过计算图的模块性矩阵的前导非负特征向量进行群落检测的结果。简而言之,两者都包含数据的社区结构。
现在是第二种情况:compare(membership(sg), membership(le))
这使用membership
,它执行以下操作:
成员身份将顶点划分为多个社区。它返回一个数字向量,每个顶点一个值,即其社区的id。社区id从一开始。请注意,一些算法计算社区的完整(或不完整(层次结构,而不仅仅是单个分区。对于这些算法,通常会返回最高模块化值的成员资格,但也请参阅各个算法的手册页面
您可以在此处阅读有关该函数的更多信息。正如您所看到的,这将返回一个包含每个顶点的成员信息的数字向量,这是compare
函数的comm1
和comm2
参数中允许的第二种类型的值。
因此,这两种说法本质上是相同的。它们只是完成同一件事的不同方式。
如果您运行文档末尾给出的代码,您将看到以下内容:
> g <- make_graph("Zachary")
> sg <- cluster_spinglass(g)
> le <- cluster_leading_eigen(g)
> compare(sg, le, 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, le, method="rand")
[1] 0.9500891
> compare(membership(sg), membership(le), method="rand")
[1] 0.9500891
正如您所看到的,两者都提供了相同的结果。
参考:
- https://igraph.org/r/doc/cluster_spinglass.html
- https://igraph.org/r/doc/communities.html
- https://igraph.org/r/doc/cluster_leading_eigen.html
- https://igraph.org/r/doc/compare.html