此函数通过计算图的模块化矩阵的主导非负特征向量,来尝试查找图中的密集连接子图。
用法
cluster_leading_eigen(
graph,
steps = -1,
weights = NULL,
start = NULL,
options = arpack_defaults(),
callback = NULL,
extra = NULL,
env = parent.frame()
)
参数
- graph
输入图。应为无向图,因为该方法需要对称矩阵。
- steps
要采取的步数,实际上是尝试步数的次数。 这不是一个特别有用的参数。
- weights
边的权重。它必须是正数值向量,
NULL
或NA
。 如果为NULL
且输入图具有“weight”边属性,则将使用该属性。 如果为NULL
且不存在此类属性,则边将具有相等的权重。 如果图是一个“weight”边属性,但您不想将其用于社群检测,请将其设置为NA
。 对于此函数,较大的边权重意味着更强的连接。- start
NULL
,或一个数值成员向量,给出算法的起始配置。- options
一个命名列表,用于覆盖一些 ARPACK 选项。
- callback
如果不是
NULL
,则它必须是回调函数。 在每次迭代之后,在计算模块化矩阵的主导特征向量之后调用它。 请参阅下面的详细信息。- extra
要提供给回调函数的附加参数。
- env
评估回调函数的环境。
值
cluster_leading_eigen()
返回一个具有以下成员的命名列表
- membership
算法结束时的成员向量,此时不再可能进行拆分。
- merges
从
membership
成员描述的状态开始的合并矩阵。 这是一个两列矩阵,每行描述两个社群的合并,第一行是第一个合并,它创建社群“N
”,N
是图中初始社群的数量,第二行创建社群N+1
,等等。- options
有关底层 ARPACK 计算的信息,请参阅
arpack()
获取详细信息。
详细信息
这些部分中记录的函数实现了 Mark Newman 开发的“主导特征向量”方法,请参阅下面的参考。
该方法的核心是模块化矩阵 B
的定义,它为 B=A-P
,A
是(无向)网络的邻接矩阵,P
包含根据“配置模型”存在的某些边的概率。 换句话说,P
的 P[i,j]
元素是在随机网络中顶点 i
和 j
之间存在边的概率,在该随机网络中,所有顶点的度数与输入图中的度数相同。
主导特征向量方法的工作原理是计算最大正特征值的模块化矩阵的特征向量,然后根据特征向量中相应元素的符号将顶点分成两个社群。 如果特征向量中的所有元素都具有相同的符号,则意味着该网络没有潜在的社群结构。 检查 Newman 的论文以了解为什么这是检测社群结构的好方法。
回调函数
callback
参数可用于提供在每次特征向量计算后调用的函数。 以下参数提供给此函数
- membership
实际的成员向量,带有从零开始的索引。
- community
算法刚刚尝试拆分的社群,社群编号从零开始。
- value
算法刚刚找到的主导特征向量所属的特征值。
- vector
算法刚刚找到的主导特征向量。
- multiplier
可用于将实际模块化矩阵与任意向量相乘的 R 函数。 提供向量作为参数以执行此乘法。 此函数可与 ARPACK 一起使用。
- extra
传递给
cluster_leading_eigen()
的extra
参数。
回调函数应返回一个标量数。 如果此数字非零,则聚类终止。
参见
modularity()
、cluster_walktrap()
、cluster_edge_betweenness()
、cluster_fast_greedy()
、as.dendrogram()
社群检测 as_membership()
、cluster_edge_betweenness()
、cluster_fast_greedy()
、cluster_fluid_communities()
、cluster_infomap()
、cluster_label_prop()
、cluster_leiden()
、cluster_louvain()
、cluster_optimal()
、cluster_spinglass()
、cluster_walktrap()
、compare()
、groups()
、make_clusters()
、membership()
、modularity.igraph()
、plot_dendrogram()
、split_join_distance()
、voronoi_cells()
作者
Gabor Csardi csardi.gabor@gmail.com
示例
g <- make_full_graph(5) %du% make_full_graph(5) %du% make_full_graph(5)
g <- add_edges(g, c(1, 6, 1, 11, 6, 11))
lec <- cluster_leading_eigen(g)
lec
#> IGRAPH clustering leading eigenvector, groups: 3, mod: 0.58
#> + groups:
#> $`1`
#> [1] 1 2 3 4 5
#>
#> $`2`
#> [1] 6 7 8 9 10
#>
#> $`3`
#> [1] 11 12 13 14 15
#>
cluster_leading_eigen(g, start = membership(lec))
#> IGRAPH clustering leading eigenvector, groups: 3, mod: 0.58
#> + groups:
#> $`1`
#> [1] 1 2 3 4 5
#>
#> $`2`
#> [1] 6 7 8 9 10
#>
#> $`3`
#> [1] 11 12 13 14 15
#>