R语言igraph包修改ARPACK特征值计算选项部分函数失效问题
igraph ARPACK参数在特征向量中心性函数中传参失效解决方案
根本原因
不存在传参语法错误,核心是igraph不同函数的参数优先级逻辑不一致:
spectrum()执行时优先读取用户传入的配置,用户传入的which参数会直接覆盖arpack_defaults()的默认值,因此自定义参数可以正常生效。centr_eigen()、eigen_centrality()、evcent()三个特征向量中心性函数内部做了强制参数覆写:程序会先合并默认ARPACK参数和用户传入的options列表,之后主动将which参数重置为"LA"(求解最大代数特征值),无论用户传入什么取值都会被覆盖,因此返回结果里options$which永远显示为"LA"。
设计逻辑说明
该处理是刻意的功能设计,不是程序bug:特征向量中心性的计算规则本身要求必须取邻接矩阵的最大正特征值对应的特征向量,硬编码which = "LA"是为了避免用户误传参数导致中心性结果不符合定义。针对无向连通图场景,"LA"和"LM"(最大模特征值)的计算结果完全一致,符合佩龙-弗罗贝尼乌斯定理结论,做标准特征向量中心性计算时不需要修改该参数。
自定义参数的实现方式
如果确实需要修改which参数(例如求解非最大代数特征值对应的特征向量,不用于标准特征向量中心性计算),可以跳过上层封装函数,直接调用底层arpack()接口传入自定义配置:
library(igraph) bb <- graph_from_literal(E-D-A-B, A-C) # 直接调用底层arpack接口,传入自定义which参数 custom_res <- arpack( func = function(x, extra) as.vector(extra %*% x), extra = as_adjacency_matrix(bb, sparse = FALSE), options = modifyList(arpack_defaults(), list(which = "LM", nev = 1)) ) # 验证参数已生效 custom_res$options$which # 输出 [1] "LM"
内容的提问来源于stack exchange,提问作者Shivam7898
相关产品推荐
相关产品推荐

