跳至主要内容

R 中的网络分析:中心性度量

探索中心性的定义,了解网络分析中不同类型的中心性度量,并为给定网络选择最合适的一种!
· 10分钟 阅读

使用 AI 探索

在进行网络分析时,您最需要做的一件事就是确定社交网络中某个节点的中心性。换句话说,如果您手头有一个网络要分析,您会想要找出哪个节点对其他节点的影响最大。本教程将专门讲解这一点。您将学习以下内容:

中心性的定义

如今,想从事网络科学研究,学会如何找到网络中的关键节点至关重要。随着研究深入,不同学科中的网络正变得愈加庞大和复杂。因此,对每个节点进行细致分析既昂贵又耗时,某种程度上也不可行。中心性的描述回答的问题是:“哪个节点是网络中最重要的?”

中心性是一个函数,它根据某个顶点对其他顶点的影响力,为该顶点分配一个数值。节点的重要性由其在网络中的位置决定。根据网络类型的不同,您可以界定“重要性”的含义。它既可以是在社交网络中具有效能影响力的个体,也可以是城市网络中的关键基础设施节点。

中心性度量:类型

中心性指标可分为局部与全局两大类。

局部中心性度量

局部中心性度量的一个示例是度中心性,它统计每个节点拥有的连接数,并指向那些能够快速与更广泛网络建立联系的个体。之所以称为局部度量,是因为它不考虑网络的其余部分,而且您对其数值的重要性判断在很大程度上取决于网络规模。

要计算诸如度这类常见中心性度量,您可以使用 igraph 包。通过 library() 函数加载即可使用:

library(igraph)

在进行任何中心性计算之前,您需要先有一个网络。为此,您可以使用随机算法之一,例如 Erdos-Renyi 模型,来构建示例图。

Erdos-Renyi 模型由两位杰出的数学家 Paul Erdos 和 Alfred Renyi 于 1959 年提出。它用于生成随机图,其中每对节点以相同的概率连成一条边。在这种随机图模型中,大多数节点的连接数大致相等,且其度分布通常为二项式或泊松分布。该模型既可用于概率方法以证明具有不同性质的图的存在性,也可用于与真实网络在结构上进行对比。

要查看 Erdos-Renyi 模型的示例,您可以使用 igraph 包中的 sample_gnm() 函数。

# n = 节点数量, m = 边的数量
erdos.gr <- sample_gnm(n=10, m=25) 

plot(erdos.gr)

model

这是一个无向网络,即具有双向边的图(与有向图相对,有向图中边从一个顶点指向另一个顶点的方向被考虑),包含 10 个节点和 25 条边。

该图的度中心性可通过 centr_degree() 函数计算:

degree.cent <- centr_degree(erdos.gr, mode = "all")
degree.cent$res

##  [1] 2 3 5 6 7 7 6 3 6 5

如上所示,在该示例网络中,节点 1 的度中心性值最高。

全局中心性度量

另一方面,全局中心性度量会考虑整个网络。最常用的全局中心性度量之一是接近中心性(closeness)。该度量根据每个节点与网络中所有其他节点的接近程度为其打分。

它计算所有节点之间的最短路径,然后根据各节点最短路径之和为其分配分数,适用于寻找最能最快影响整个网络的个体。

建议在单个簇内使用接近中心性来寻找中心顶点。您可以通过 igraph 包中的 closeness() 函数进行计算。

closeness.cent <- closeness(erdos.gr, mode="all")
closeness.cent

##  [1] 0.05882353 0.06250000 0.07142857 0.08333333 0.09090909 0.09090909
##  [7] 0.08333333 0.06250000 0.08333333 0.07692308

根据接近中心性的结果,与度中心性不同,节点 1 和 9 在整个网络中的中心性值最高。这意味着这两个节点在网络的信息流中承担着同等重要的角色。

如何选择最佳中心性度量

尽管有不同类型的中心性度量可用于确定网络中最具影响力的节点,但在网络科学中,针对给定网络选择并实施最契合的度量仍尚无统一的流程。

为说明这一点,下图展示了两种中心性度量“子图中心性”(subgraph centrality)与“拓扑系数”(topological coefficient)之间的散点图。红线表明这两种中心性度量之间存在强烈的负相关关系。

plot

您可以从上述图示得出结论:由于这两种中心性成反向关系,它们会基于不同的模式来区分网络中的中心节点,因此中心性计算的结果会随中心性类型而变化。

目前已有超过 140 个基准可用于识别中心顶点,但应使用哪一个来计算关键节点呢?

此外,由于网络的拓扑特征会影响中心性计算的结果,您必须根据网络拓扑选择能够提供关于关键顶点信息量最高的度量标准。

CINNA(Central Informative Nodes in Network Analysis)是一个提交至 CRAN 的R 包,用于计算、分析与比较中心性度量。

要了解如何使用该包,您可以从包内的数据集之一 Zachary 开始。该数据集展示了一所大学空手道俱乐部成员之间的友谊关系:

library(CINNA)

data("zachary")

plot(zachary)

undirected graph

这是一个无向图,包含 34 个顶点和 78 条边。请记住,无向图中的边没有方向:它们是双向的。例如:A<--->B == B<--->A。

要根据图结构找出可计算的中心性类型,proper_centralities() 函数很有用。

pr_cent<-proper_centralities(zachary)

##  [1] "subgraph centrality scores"                      
##  [2] "Topological Coefficient"                         
##  [3] "Average Distance"                                
##  [4] "Barycenter Centrality"                           
##  [5] "BottleNeck Centrality"                           
##  [6] "Centroid value"                                  
##  [7] "Closeness Centrality (Freeman)"                  
##  [8] "ClusterRank"                                     
##  [9] "Decay Centrality"                                
## [10] "Degree Centrality"                               
## [11] "Diffusion Degree"                                
## [12] "DMNC - Density of Maximum Neighborhood Component"
## [13] "Eccentricity Centrality"                         
## [14] "eigenvector centralities"                        
## [15] "K-core Decomposition"                            
## [16] "Geodesic K-Path Centrality"                      
## [17] "Katz Centrality (Katz Status Index)"             
## [18] "Kleinberg's authority centrality scores"         
## [19] "Kleinberg's hub centrality scores"               
## [20] "clustering coefficient"                          
## [21] "Lin Centrality"                                  
## [22] "Lobby Index (Centrality)"                        
## [23] "Markov Centrality"                               
## [24] "Radiality Centrality"                            
## [25] "Shortest-Paths Betweenness Centrality"           
## [26] "Current-Flow Closeness Centrality"               
## [27] "Closeness centrality (Latora)"                   
## [28] "Communicability Betweenness Centrality"          
## [29] "Community Centrality"                            
## [30] "Cross-Clique Connectivity"                       
## [31] "Entropy Centrality"                              
## [32] "EPC - Edge Percolated Component"                 
## [33] "Laplacian Centrality"                            
## [34] "Leverage Centrality"                             
## [35] "MNC - Maximum Neighborhood Component"            
## [36] "Hubbell Index"                                   
## [37] "Semi Local Centrality"                           
## [38] "Closeness Vitality"                              
## [39] "Residual Closeness Centrality"                   
## [40] "Stress Centrality"                               
## [41] "Load Centrality"                                 
## [42] "Flow Betweenness Centrality"                     
## [43] "Information Centrality"

输出包含一个列表,列出了适用于无向且无权结构的 43 个常见中心性名称。

我们从列表中选择前五种中心性度量并将其传递给 calculate_centralities() 函数,因为计算所有可计算的中心性会非常耗时。

下一步,您将使用主成分分析(PCA)算法来甄别信息量最大的中心性度量。

请记住,PCA 是一种用于线性分析的降维技术。

在此分析步骤中,每一种中心性度量都作为一个变量。因此,与主成分相关性较强的中心性更有助于识别中心节点。PCA 的贡献度指标显示各变量对主成分的贡献。

换言之,变量的贡献度以百分比形式度量其相对于主成分的变异性。借助 PCA 方法中的该指标,您可以识别哪些中心性包含了更多关于中心节点的信息,从而判断哪一种能更准确地描述网络中的关键顶点。由此,对中心性的贡献度进行排序即可按如下方式可视化。

接下来,您将使用管道操作符 %>% 连续执行这两个步骤:

calculate_centralities(zachary, include = pr_cent[1:5])%>%
  pca_centralities(scale.unit = TRUE)

bar chart

如图所示,在这五个中心性指标中,重心中心性(Barycenter Centrality)的贡献度最高。

换句话说,在所计算的中心性度量中,它关于关键节点的信息量最大。因此,相较于其他所选中心性,它能更准确地确定中心节点。

如果用一个图来表示各节点,并以节点大小表示其对应的中心性值,将得到如下效果。

visualize_graph( zachary , centrality.type="Barycenter Centrality")

graph

由此可见,节点 1 是整体上最中心的节点。

总结

总的来说,为了量化网络的连通性,建议先根据网络结构计算若干中心性度量,再对其应用 PCA,并选择信息量最大的那一个来进行计算与解释,从而相对于其对应的主成分获得最大贡献。

在本教程中,您首先给出了中心性的定义,并介绍了几种常见的中心性。随后强调,由于网络的全局属性会影响中心组件的识别,网络中的关键节点会因拓扑不同而有所差异。

接着,您使用了 CINNA 包,它提供了在网络中开展中心性分析所需的全部功能。借助该包,您无需额外工作即可在您的网络上开展中心性分析。此外,这也显著提高了中心节点判定的准确性。

如果您想更深入地了解并查看其工作原理,请参阅这篇论文,以及这篇。

如对以上内容有任何问题或疑虑,请随时通过 Minoo_Ashtiani 与我联系。

想进一步学习 R,请查看我们的R 基础编程技能教程以及以下课程:

主题