跳到内容

此函数通过计算图的模块化矩阵的主导非负特征向量,来尝试查找图中的密集连接子图。

用法

cluster_leading_eigen(
  graph,
  steps = -1,
  weights = NULL,
  start = NULL,
  options = arpack_defaults(),
  callback = NULL,
  extra = NULL,
  env = parent.frame()
)

参数

graph

输入图。应为无向图,因为该方法需要对称矩阵。

steps

要采取的步数,实际上是尝试步数的次数。 这不是一个特别有用的参数。

weights

边的权重。它必须是正数值向量,NULLNA。 如果为 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-PA 是(无向)网络的邻接矩阵,P 包含根据“配置模型”存在的某些边的概率。 换句话说,PP[i,j] 元素是在随机网络中顶点 ij 之间存在边的概率,在该随机网络中,所有顶点的度数与输入图中的度数相同。

主导特征向量方法的工作原理是计算最大正特征值的模块化矩阵的特征向量,然后根据特征向量中相应元素的符号将顶点分成两个社群。 如果特征向量中的所有元素都具有相同的符号,则意味着该网络没有潜在的社群结构。 检查 Newman 的论文以了解为什么这是检测社群结构的好方法。

回调函数

callback 参数可用于提供在每次特征向量计算后调用的函数。 以下参数提供给此函数

membership

实际的成员向量,带有从零开始的索引。

community

算法刚刚尝试拆分的社群,社群编号从零开始。

value

算法刚刚找到的主导特征向量所属的特征值。

vector

算法刚刚找到的主导特征向量。

multiplier

可用于将实际模块化矩阵与任意向量相乘的 R 函数。 提供向量作为参数以执行此乘法。 此函数可与 ARPACK 一起使用。

extra

传递给 cluster_leading_eigen()extra 参数。

回调函数应返回一个标量数。 如果此数字非零,则聚类终止。

参考文献

MEJ Newman:使用矩阵的特征向量查找社群结构,Physical Review E 74 036104, 2006。

作者

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
#>