NetworkX 2.8.8 实战:Python 计算复杂网络 3 大核心指标(度分布/平均路径/集聚系数)

📅 2026/7/11 23:29:36
NetworkX 2.8.8 实战:Python 计算复杂网络 3 大核心指标(度分布/平均路径/集聚系数)
NetworkX 2.8.8 实战Python 计算复杂网络 3 大核心指标度分布/平均路径/集聚系数1. 复杂网络分析基础复杂网络分析已成为理解现实世界系统的强大工具从社交网络到交通系统再到生物分子相互作用网络。Python 的 NetworkX 库提供了完整的工具集让我们能够轻松计算和分析网络的关键特征指标。网络分析的核心在于三个基本结构特征度分布描述节点连接数量的分布规律平均路径长度反映网络的信息传递效率集聚系数衡量节点形成集群的趋势import networkx as nx import matplotlib.pyplot as plt import numpy as np from collections import defaultdict # 创建示例图 G nx.erdos_renyi_graph(n100, p0.1, seed42)2. 度分布计算与分析度分布是网络最基本的拓扑特征它揭示了网络连接的整体模式。在无标度网络中度分布通常服从幂律分布即少数节点拥有大量连接枢纽节点而大多数节点只有少量连接。2.1 计算节点度分布def plot_degree_distribution(G): degrees [G.degree(n) for n in G.nodes()] degree_counts defaultdict(int) for d in degrees: degree_counts[d] 1 # 排序度值 sorted_degrees sorted(degree_counts.items()) x, y zip(*sorted_degrees) # 绘制双对数坐标图 plt.figure(figsize(10, 6)) plt.loglog(x, y, bo-) plt.title(Degree Distribution (Log-Log Scale)) plt.xlabel(Degree (k)) plt.ylabel(P(k)) plt.grid(True, whichboth, ls-) plt.show() plot_degree_distribution(G)2.2 度分布类型识别度分布类型特征典型网络泊松分布随机网络大多数节点度相近ER随机网络幂律分布少数节点度极高多数节点度低互联网、社交网络指数分布介于随机和无标度之间部分技术网络关键指标计算# 计算网络平均度 avg_degree sum(dict(G.degree()).values()) / G.number_of_nodes() # 计算度分布的二阶矩 degrees np.array(list(dict(G.degree()).values())) second_moment np.mean(degrees**2)3. 平均路径长度计算平均路径长度衡量了网络中信息传递的效率是小世界网络的重要特征之一。3.1 计算方法比较# 精确计算适用于小型网络 avg_shortest_path nx.average_shortest_path_length(G) # 近似计算适用于大型网络 def approx_avg_path_length(G, sample_size100): nodes list(G.nodes()) sampled_nodes np.random.choice(nodes, sizemin(sample_size, len(nodes)), replaceFalse) path_lengths [] for i, u in enumerate(sampled_nodes): for v in list(sampled_nodes)[i1:]: try: path_lengths.append(nx.shortest_path_length(G, u, v)) except nx.NetworkXNoPath: continue return sum(path_lengths) / len(path_lengths) if path_lengths else float(nan) approx_path approx_avg_path_length(G)3.2 路径长度分布可视化def plot_path_length_distribution(G): path_lengths [] for node in G: lengths nx.shortest_path_length(G, node) path_lengths.extend(lengths.values()) plt.figure(figsize(10, 6)) plt.hist(path_lengths, binsrange(max(path_lengths)1), densityTrue) plt.title(Path Length Distribution) plt.xlabel(Path Length) plt.ylabel(Frequency) plt.grid(True) plt.show() plot_path_length_distribution(G)提示对于大型网络精确计算所有节点对的最短路径代价很高。实际应用中通常采用抽样方法估算平均路径长度。4. 集聚系数分析集聚系数量化了节点邻居之间的连接紧密程度是衡量网络小世界特性的关键指标。4.1 局部与全局集聚系数# 计算单个节点的局部集聚系数 node_clustering nx.clustering(G) # 计算全局集聚系数两种方法 global_clustering1 nx.average_clustering(G) global_clustering2 nx.transitivity(G) # 另一种计算方式 # 绘制集聚系数与度的关系 def plot_clustering_vs_degree(G): clustering nx.clustering(G) degrees dict(G.degree()) # 按度分组计算平均集聚系数 degree_clust defaultdict(list) for n in G.nodes(): degree_clust[degrees[n]].append(clustering[n]) avg_clust {k: sum(v)/len(v) for k, v in degree_clust.items() if len(v) 5} plt.figure(figsize(10, 6)) plt.loglog(avg_clust.keys(), avg_clust.values(), ro) plt.title(Clustering Coefficient vs Degree) plt.xlabel(Degree (k)) plt.ylabel(Average Clustering Coefficient) plt.grid(True) plt.show() plot_clustering_vs_degree(G)4.2 集聚系数类型对比类型公式特点局部集聚系数$C_i \frac{2T_i}{k_i(k_i-1)}$反映单个节点的聚集程度全局集聚系数$C \frac{3 \times \text{三角形数}}{\text{连通三元组数}}$反映整个网络的聚集程度平均集聚系数$\langle C \rangle \frac{1}{N}\sum_i C_i$节点局部系数的平均值5. 综合应用航空网络分析案例让我们将这些指标应用于实际网络分析使用美国航空网络数据集# 加载航空网络数据 airport_G nx.read_edgelist(airports.txt, nodetypestr, data((weight, float),)) # 计算核心指标 metrics { Number of Nodes: airport_G.number_of_nodes(), Number of Edges: airport_G.number_of_edges(), Average Degree: sum(dict(airport_G.degree()).values()) / airport_G.number_of_nodes(), Average Path Length: approx_avg_path_length(airport_G), Global Clustering: nx.average_clustering(airport_G), Diameter: nx.diameter(airport_G) if nx.is_connected(airport_G) else Disconnected } # 显示结果表格 print(航空网络特征指标:) print(------------------) for metric, value in metrics.items(): print(f{metric:25}: {value})航空网络分析结果示例指标值解释平均路径长度2.36任意两机场平均需2.36次转机集聚系数0.62高度聚集航线形成枢纽结构度分布幂律存在少数大型枢纽机场# 绘制网络关键节点 def plot_network_hubs(G, top_n10): degrees dict(G.degree()) top_nodes sorted(degrees.items(), keylambda x: x[1], reverseTrue)[:top_n] pos nx.spring_layout(G) plt.figure(figsize(12, 8)) # 绘制所有节点 nx.draw_networkx_nodes(G, pos, node_size10, node_colorblue, alpha0.3) nx.draw_networkx_edges(G, pos, alpha0.1) # 突出显示枢纽节点 hub_nodes [n[0] for n in top_nodes] nx.draw_networkx_nodes(G, pos, nodelisthub_nodes, node_size300, node_colorred) # 添加标签 labels {n[0]: f{n[0]}\n(k{n[1]}) for n in top_nodes} nx.draw_networkx_labels(G, pos, labelslabels, font_size8) plt.title(fTop {top_n} Hub Airports) plt.axis(off) plt.show() plot_network_hubs(airport_G)通过这个完整案例我们展示了如何使用NetworkX计算和分析复杂网络的三大核心指标。这些技术可以轻松扩展到社交网络分析、基础设施网络评估和生物网络研究等领域。