概述
一个点的接近中心性(Closeness Centrality)是由该点到它可连通的其它各点的最短距离的平均值来衡量的。一个点与其他所有点相距越近,这个点的中心性就越高。接近中心性算法广泛应用于关键社交节点发现、功能性场所选址等场景。
接近中心性算法更适用于连通图。对于非连通图,推荐使用它的变体——调和中心性。
接近中心性的取值范围是0到1,节点的分值越大,距离其他节点越近。
接近中心性的原始概念是由Alex Bavelas于1950年提出的:
- A. Bavelas, Communication patterns in task-oriented groups (1950)
基本概念
最短距离
两个点之间的最短距离是指它们之间最短路径的边数。最短路径是按照BFS的原则进行寻找的,如果将一个点看作起点,另一个点是该点的第K步邻居,它们之间的最短距离就是K。关于BFS和K邻的详细介绍,请阅读全图K邻。
考察以上无向图中红、绿两点之间的最短距离。由于是无向图,无论是以红色还是绿色节点为起点,它们均为对方的2步邻居,即它们的最短距离为2。
将上面的无向图修改为有向图后,再次考察红、绿两点之间的最短距离。如果考虑边的方向。从红色节点到绿色节点入方向最短距离为3,出方向最短距离为4。
当考虑边权重时,两个节点之间的最短距离是它们之间路径中边的最小权重之和。
在为边分配权重后,检查红色和绿色节点之间的最短距离。为了最小化总权重,选择具有更多边的路径,从而产生总权重5。
接近中心性
在本算法中,节点的接近中心性分值等于该点与其他能够相连的各节点的最短距离算数平均值(Arithmetic Mean)的倒数。计算公式为:
其中,x
为待计算的目标节点,y
为通过边与x
相连的任意一个节点(不包含x
),k-1
为y
的个数,d(x,y)
为x
到y
的最短距离。
计算上图中红色节点入方向的接近中心性。入方向上红色节点仅可连通蓝、黄、紫三个节点,故其接近中心性为3 / (2 + 1 + 2) = 0.6
。通过入边不可达的绿色、灰色节点不参与计算。
接近中心性算法会消耗很多计算资源。在一个有V个节点的图中,建议当V>10000时通过采样进行近似计算,推荐的采样个数是节点数以10为底的对数(
log(V)
)。
每次执行算法时,只进行一次采样,每个节点的中心性分值是基于该节点到所有样本节点的最短距离计算的。
特殊说明
- 孤点的接近中心性分值为0。
- 计算某点的接近中心性时,会排除那些不可连通的节点,比如孤点、其他连通分量内的点或是虽然属于同一连通分量但在规定的方向上不可达的节点等。
语法
- 命令:
algo(closeness_centrality)
- 参数:
名称 |
类型 |
规范 |
默认 |
可选 |
描述 |
---|---|---|---|---|---|
ids / uuids | []_id / []_uuid |
/ | / | 是 | 待计算节点的ID/UUID,忽略则计算全部点 |
direction | string | in , out |
/ | 是 | 最短路径中所有边的方向,in 是入方向,out 是出方向 |
sample_size | int | -1 , -2 , [1, V] |
-2 |
是 | 采样节点数;-1 代表采样数为log(V) ,-2 代表不采样进行精确计算,一个介于[1, V]的数代表采样规定数目的节点;sample_size 只有在忽略ids (uuids )时或它指定所有节点时有效 |
limit | int | ≥-1 | -1 |
是 | 返回的结果条数,-1 返回所有结果 |
order | string | asc , desc |
/ | 是 | 按中心性分值大小对结果进行排序 |
示例
示例图如下:
文件回写
配置项 | 回写内容 |
---|---|
filename | _id ,centrality |
algo(closeness_centrality).params().write({
file:{
filename: 'centrality'
}
})
结果:文件centrality
LA,0.583333
LB,0.636364
LC,0.5
LD,0.388889
LE,0.388889
LF,0.368421
LG,0.538462
LH,0.368421
属性回写
配置项 | 回写内容 | 回写至 | 数据类型 |
---|---|---|---|
property | centrality |
点属性 | float |
algo(closeness_centrality).params().write({
db:{
property: 'cc'
}
})
结果:每个节点的中心性分值回写至名为cc的点属性下
直接返回
别名序号 | 类型 | 描述 | 列名 |
---|---|---|---|
0 | []perNode | 点及其中心性 | _uuid , centrality |
algo(closeness_centrality).params({
direction: 'out',
order: 'desc',
limit: 3
}) as cc
return cc
结果:cc
_uuid | centrality |
---|---|
1 | 0.75000000 |
3 | 0.60000002 |
2 | 0.50000000 |
流式返回
别名序号 | 类型 | 描述 | 列名 |
---|---|---|---|
0 | []perNode | 点及其中心性 | _uuid , centrality |
algo(closeness_centrality).params({
direction: 'in'
}).stream() as cc
where cc.centrality == 0
return cc
结果:cc
_uuid | centrality |
---|---|
4 | 0.0000000 |
6 | 0.0000000 |