R iGraph包cluster_leading_eigen无法合并为两个社区问题咨询
解决iGraph中cluster_leading_eigen合并社区的问题及merges矩阵差异解析
嘿,我来帮你理清这个问题——我在Stack Overflow上处理过不少iGraph聚类的问题,刚好对这两个函数的差异很熟悉。
一、为什么两个聚类函数的merges矩阵结构不一样?
核心原因是这两个算法的底层逻辑完全不同:
cluster_edge_betweenness是典型的层次聚合聚类:它从每个节点单独成一个社区开始,每次把边介数最低的两个社区合并,直到所有节点归为一个社区。所以它的merges矩阵是标准的层次合并序列,行数是节点数-1,每一行记录一次两个社区的合并操作,结构非常规整。- 而
cluster_leading_eigen是谱聚类算法,它的核心是通过计算图拉普拉斯矩阵的特征向量来识别“显著”的社区划分。它本身并不是层次聚类算法——它会先找出最明显的社区分裂,然后递归地在子社区里继续划分,直到找不到显著的分裂为止。它的merges矩阵是为了兼容iGraph的层次聚类接口才生成的,只记录了算法实际进行的分裂/合并步骤,而不是从单个节点开始的完整合并链。所以它的merges矩阵行数会比节点数-1少很多,合并的起点也不是单个节点,结构自然和cluster_edge_betweenness的不一样。
二、怎么用cluster_leading_eigen得到2个社区?
你遇到的警告,大概率是因为强行用层次合并的方式去处理cluster_leading_eigen的结果,但它的merges矩阵并不完整。这里有两个靠谱的解决办法:
方法1:直接指定社区数量运行算法
cluster_leading_eigen有个k参数,可以直接告诉算法你要划分成几个社区。比如你的图对象是g,那代码可以这么写:
library(igraph) # 直接生成2个社区 two_communities <- cluster_leading_eigen(g, k = 2)
这样算法会直接针对“划分成2个社区”的目标进行计算,不需要后续合并操作,自然就不会触发merges矩阵相关的警告。
方法2:从已有聚类结果合并到2个社区
如果你已经跑了默认的cluster_leading_eigen,想把结果合并到2个社区,可以用cut_at函数,但要注意:只有当算法生成的层次结构支持合并到2个社区时才有效。比如如果默认结果有3个社区,那cut_at(communities, no = 2)是可行的;但如果默认结果只有2个社区,或者merges矩阵的行数不够,就会弹出警告。所以还是方法1更稳妥。
另外,如果你看到类似“merges矩阵不完整”的警告,不用慌——这只是在告诉你,cluster_leading_eigen的merges不是完整的层次合并链,它只记录了算法本身做的那几步划分操作。
三、额外补充
cluster_leading_eigen的merges矩阵是分裂式的(从大社区拆成小社区),而cluster_edge_betweenness的是聚合式的(从小节点合并成大社区),这也是两者矩阵方向和内容差异的另一个原因。- 如果你需要完整的层次合并树,那
cluster_edge_betweenness这类层次聚类算法更适合;如果是追求基于谱特征的社区划分,直接用k参数指定社区数量给cluster_leading_eigen是最高效的方式。
内容的提问来源于stack exchange,提问作者L. Hansen
相关产品推荐
相关产品推荐

