使用NetworkX计算网络功能


介绍

计算图形时使用什么?帕杰克?还是igraph?
我使用networkx。原因是Python。
由于pajek仅是用于Windows的软件,因此它在linux上不起作用(如果您使用wine,它似乎可以工作),并且由于igraph是R,因此在处理日语和编译软件包方面的错误很麻烦。
考虑到网络分析本身,pajek和igraph更为传统和良好,但是考虑到编程语言本身的便利性,我认为它总共是Python networkx。
这次,我想看看如何使用此类networkx计算基本图形特征。
所有这些代码均已上传到Gist,因此也请在此查看。

整个网络的功能

图形生成

首先,生成要分析的网络。 networkx提供了生成各种图形的功能,例如完整图形,随机网络和小型世界网络。这次,我将在无标度网络上进行尝试。

1
2
import networkx as nx
G = nx.barabasi_albert_graph(30, 1)

使用以下方法进行目视检查。

1
2
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos)

scalefree.png

平均距离

1
2
nx.average_shortest_path_length(G)
>> 3.949425287356322

与随机图

相比

1
2
3
G_random = nx.connected_watts_strogatz_graph(30, 2, 1)
nx.average_shortest_path_length(G_random)
>> 5.917241379310345

您可以检查small world属性。

聚类系数

1
2
nx.average_clustering(G)
>> 0.0

该示例中的Albert Barabashi模型具有以下特征:聚类系数很小,但是这次变为0。

中心性

学位中心

1
2
3
4
5
6
7
8
degree_centers = nx.degree_centrality(G)
sorted(degree_centers.items(), key=lambda x: x[1], reverse=True)[:5]
>>>
[(5, 0.27586206896551724),
 (0, 0.1724137931034483),
 (1, 0.13793103448275862),
 (4, 0.13793103448275862),
 (7, 0.10344827586206896)]

以字典格式为每个节点提供中心性。
使用字典排序方法对它们进行降序排序。

邻近中心

1
2
3
4
5
6
7
8
close_centers = nx.closeness_centrality(G)
sorted(close_centers.items(), key=lambda x: x[1], reverse=True)[:5]
>>>
[(1, 0.4027777777777778),
 (0, 0.3815789473684211),
 (5, 0.3717948717948718),
 (4, 0.31521739130434784),
 (2, 0.3020833333333333)]

我期望结果与学位中心化相同,但有所不同。平均而言,最接近所有其他节点的节点似乎是第一。

调解中心

1
2
3
4
5
6
7
8
between_centers = nx.betweenness_centrality(G)
sorted(between_centers.items(), key=lambda x: x[1], reverse=True)[:5]
>>>
[(1, 0.6379310344827587),
 (5, 0.6108374384236454),
 (0, 0.6059113300492611),
 (4, 0.3620689655172414),
 (8, 0.19704433497536947)]

在将一个集群连接到另一个集群时,调解中心性往往更高,但是在Albert-Barabashi模型中,首先没有集群,因此结果与其他指标没有太大不同。

特征向量中心性

1
2
3
4
5
6
7
8
eigen_centers = nx.eigenvector_centrality_numpy(G)
sorted(eigen_centers.items(), key=lambda x: x[1], reverse=True)[:5]
>>>
[(5, 0.6148871002455658),
 (1, 0.36311628358126075),
 (7, 0.2565216963136699),
 (0, 0.23924881680129484),
 (10, 0.2256761992171005)]

这推高了集线器附近节点的中心位置,因此排名在5附近的节点的中心度都很高。顺便说一下,nx.eigenvector_centrality没有收敛,所以我使用的是numpy版本。