1、复杂网络的连通性
1.1、无向网络中的巨片
首先考虑地球上所有人类组成的社会网络的连通性;很显然整个网络是不连通的,因为只要有一个人没有朋友或者说只要有一小群人没有除了这群人之外的朋友那么整个网络就不连通。
由此可见,对于大规模网络来说,连通性非常脆弱,只要单个节点或者小部分节点的行为都有可能破坏连通性。
我们可以看出大规模复杂网络可能会出现一个大的连通片,这个连通片包含整个网络中的大部分节点,那么称这个连通片为巨片
1.2、有向网络中的蝴蝶结结构
1、强连通核(Strongly Connected Core,SCC):也成为强连通巨片,位于网络中心。SCC中任意两个节点之间都是强连通的,即存在从任意节点到另一节点的有向路径。
2、入部(IN):
3、出部(OUT):
4、卷须(Tendrils):
5、管子(Tube):
2、节点的度与网络稀疏性
2.1、 度与平均度
度(Degree)是刻画单个节点属性的最简单而又最重要的概念之一。
无向网络中节点 i 的度定义为与节点 i 直接相连的边的数目。
网络中所有节点的度的平均值成为网络的平均度(average degree),记为 <k> 。
import networkx as nx
#生成一个n=1000,起始节点为3的BA无标度网络
G = nx.random_graphs.barabasi_albert_graph(1000,3)
#返回某个节点的度
G.degree(0)
#返回所有节点的度
G.degree()
#返回图中所有节点的度分布序列(从1至最大度的出现频次)
nx.degree_histogram(G)
#可返回单个节点的度,也可返回所有节点的度
def degree(G, nbunch=None, weight=None):
"""Returns a degree view of single node or of nbunch of nodes.
If nbunch is omitted, then return degrees of *all* nodes.
"""
return G.degree(nbunch, weight)
#返回图中所有节点的度分布序列(从1至最大度的出现频次)
def degree_histogram(G):
"""Returns a list of the frequency of each degree value.
Parameters
----------
G : Networkx graph
A graph
Returns
-------
hist : list
A list of frequencies of degrees.
The degree values are the index in the list.
Notes
-----
Note: the bins are width one, hence len(list) can be large
(Order(number_of_edges))
"""
counts = Counter(d for n, d in G.degree())
return [counts.get(i, 0) for i in range(max(counts) + 1)]
2.2、出度与入度
有向网络中节点的度包括出度和入度
节点 i 的出度是指从节点 i 指向其他节点的边的数目
'''
通过邻接矩阵来表示
'''
i的出度
k_out = 0
i = 任意节点数
for j in num_of_node:
if a[i][j] != 0:
k_out = a[i][j] + 1
节点 i 的入度是指从其他节点指向节点 i 的边的数目
'''
通过邻接矩阵来表示
'''
i的入度
k_in = 0
i = 任意节点数
for j in num_of_node:
if a[j][i] != 0:
k_out = a[j][i] + 1
2.3、网络稀疏性与稠密化
一个包含N个节点的网络的密度(Density)ρ定义为网络中实际存在的边数M与最大可能边数之比。对于无向网络,我们有:
ρ
=
M
1
2
N
(
N
−
1
)
ρ=\frac{M}{\frac{1}{2}N(N - 1)}
ρ=21N(N−1)M
平均度和网络密度之间的关系:
<
k
>
=
2
M
N
=
(
N
−
1
)
ρ
≈
N
ρ
<k> = \frac{2M}{N} = (N - 1)ρ ≈ Nρ
<k>=N2M=(N−1)ρ≈Nρ
将t时刻的网络中的节点数和边数分别记为N(t),M(t),如果两者呈线性比例关系,即N(t) ~ M(t),
以下是使用 NetworkX 计算网络基本拓扑性质的具体实现方法及相关指标说明:
一、基础拓扑属性计算
- 节点与边数量
# 节点数
node_count = G.number_of_nodes()
# 边数(无向图每条边计1次)
edge_count = G.number_of_edges()
- 平均度数
import numpy as np
degrees = [d for _, d in G.degree()]
avg_degree = np.mean(degrees)
- 密度计算
density = nx.density(G) # 2*边数/(节点数*(节点数-1))
二、路径分析
- 最短路径与直径
# 节点0到42的最短路径
shortest_path = nx.shortest_path_length(G, source=0, target=42)
# 网络直径(最长最短路径)
diameter = nx.diameter(G)
- 平均路径长度
avg_path_length = nx.average_shortest_path_length(G)
三、聚类分析
- 局部聚类系数
# 单个节点聚类系数
clustering_0 = nx.clustering(G, 0)
# 全网络平均聚类系数
avg_clustering = nx.average_clustering(G)
- 全局聚类系数
transitivity = nx.transitivity(G) # 三元闭包比例
四、度分布分析
from collections import Counter
degree_dist = Counter(degrees)
plt.bar(degree_dist.keys(), degree_dist.values())
plt.xlabel('Degree')
plt.ylabel('Frequency')
五、其他重要指标
指标类型 | NetworkX 实现方法 | 典型应用场景 |
---|---|---|
连通性检测 | nx.is_connected(G) | 网络完整性分析 |
度相关性 | nx.degree_assortativity_coefficient(G) | 同配性分析 |
中心性指标 | nx.degree_centrality(G) | 关键节点识别 |
模块度 | nx.algorithms.community.modularity | 社区发现 |
六、性能优化建议
- 大规模网络计算平均路径长度时,建议使用近似算法:
avg_path_approx = nx.approximation.average_shortest_path_length(G)
- 节点度数分布分析可结合幂律检测:
from powerlaw import Fit
fit = Fit(degrees)
应用案例参考:在 Facebook 社交网络分析中(4039 节点/88234 边),测得平均路径长度 3.69,直径 8,平均度数 43.69,显示出典型的小世界特性。实际应用中需注意:
- 最短路径计算时间复杂度为 O(n^3),万级节点需分布式计算
- 社区发现推荐使用 Louvain 算法(
nx.community.louvain_communities
) - 可视化布局优先考虑 Fruchterman-Reingold 算法(
nx.spring_layout
)
建议结合具体网络类型(有向/加权/多图)选择对应方法,如加权网络需在函数中指定 weight='weight'
参数。