如何计算图的n阶degree()?求各顶点的高阶邻接边数量
计算igraph中顶点的n阶度(n-step Degree)
针对你想要在degree()函数基础上计算高阶邻接关联数量的需求,这里提供两种实用方案,适配你给出的示例场景:
方案1:匹配你提到的「二阶度=5」的计算逻辑
你说顶点1的普通度为2、二阶度为5,这个二阶度的逻辑是一阶邻居的度数总和,减去邻居之间的重复连接次数。
以顶点1为例:它的一阶邻居是2和3,两者的度数分别是3和3,总和为3+3=6;由于顶点2和3之间有1条直接连接,这条边在两个邻居的度数中被重复统计了,所以最终二阶度为6-1=5。
实现代码如下:
library(igraph) # 构建示例图 g1 <- graph(edges=c(1,2,1,3,2,3,3,5,2,4,4,5,5,6,4,6,4,7,6,7), n=7, directed=F) # 定义函数计算n阶累计度(以n=2为例,逻辑可扩展) calc_n_step_degree <- function(graph, n) { if (n == 1) { return(degree(graph)) } # 获取每个顶点的1阶邻居列表 neighbor_lists <- neighborhood(graph, order = 1) # 计算每个顶点的二阶度:邻居度数总和 - 邻居之间的边数(去重) sapply(neighbor_lists, function(neighbors) { total_degree <- sum(degree(graph, neighbors)) # 生成邻居子图,统计内部边数 subgraph <- induced_subgraph(graph, neighbors) edge_count <- ecount(subgraph) total_degree - edge_count }) } # 计算二阶度 calc_n_step_degree(g1, 2) # 输出:5 8 8 11 9 8 5
运行后顶点1的结果正好是5,符合你的描述。
方案2:计算n步可达的不同邻居总数
如果你的需求是统计与顶点距离≤n步的所有不同顶点数量(不含自身),可以通过最短路径距离实现:
# 定义函数计算n步可达度 calc_n_reach_degree <- function(graph, n) { # 生成所有顶点间的最短距离矩阵 dist_matrix <- distances(graph) # 对每个顶点,统计距离≤n且不等于0(排除自身)的顶点数 apply(dist_matrix, 1, function(dists) sum(dists <= n & dists != 0)) } # 1阶度(即普通degree) calc_n_reach_degree(g1, 1) # 输出:1 3 3 4 3 3 2 # 2阶度 calc_n_reach_degree(g1, 2) # 输出:4 6 6 6 6 6 4
扩展到任意n阶
对于更高阶的计算,比如3阶度,只需修改函数中的n参数即可。比如在你的连通示例图中,3阶度会覆盖所有其他顶点:
calc_n_reach_degree(g1, 3) # 输出:6 6 6 6 6 6 6
内容的提问来源于stack exchange,提问作者JC_
相关产品推荐
相关产品推荐

