在众多领域中,复杂网络结构蕴含着丰富的信息,如社交网络里人与人的关系、交通网络中城市间的连接等。Python 的 NetworkX 库是探索这些复杂网络的得力工具,它提供了创建、分析和可视化网络的功能,助力我们挖掘网络背后的规律。
NetworkX 网络构建基础
- 基本图创建:NetworkX 能轻松创建不同类型的图。以创建简单无向图为例:
import networkx as nx
# 创建无向图
graph = nx.Graph()
# 添加节点
graph.add_node(1)
graph.add_nodes_from([2, 3, 4])
# 添加边
graph.add_edge(1, 2)
graph.add_edges_from([(2, 3), (3, 4), (4, 1)])
通过nx.Graph()初始化无向图,add_node方法添加单个节点,add_nodes_from可批量添加节点,add_edge和add_edges_from分别用于添加单条边和多条边。
2. 有向图构建:有向图在表明具有方向性的关系时十分有用。构建有向图如下:
import networkx as nx
directed_graph = nx.DiGraph()
directed_graph.add_nodes_from([1, 2, 3])
directed_graph.add_edges_from([(1, 2), (2, 3), (3, 1)])
nx.DiGraph()用于创建有向图,节点和边的添加方式与无向图类似,但边的方向性决定了信息或关系的流向。
网络属性与特征分析
- 节点和边的属性设置与获取:为节点和边赋予属性,能让网络携带更多信息。列如为节点添加 “重大性” 属性,为边添加 “权重” 属性:
import networkx as nx
graph = nx.Graph()
graph.add_nodes_from([1, 2, 3], importance = 0.5)
graph.add_edges_from([(1, 2), (2, 3)], weight = 10)
# 获取节点属性
print(graph.nodes[1]['importance'])
# 获取边属性
print(graph.edges[(1, 2)]['weight'])
在添加节点和边时,通过关键字参数设置属性,之后可方便地获取这些属性值。
2. 中心性度量:中心性是衡量节点在网络中重大程度的指标。以介数中心性(Betweenness Centrality)为例,它反映了节点在网络中作为桥梁的重大性:
import networkx as nx
graph = nx.karate_club_graph()
betweenness_centrality = nx.betweenness_centrality(graph)
sorted_nodes = sorted(betweenness_centrality.items(), key = lambda item: item[1], reverse = True)
for node, centrality in sorted_nodes[:5]:
print(f"节点 {node} 的介数中心性: {centrality}")
nx.betweenness_centrality函数计算每个节点的介数中心性,这里以著名的空手道俱乐部图为例进行计算,并对结果进行排序,展示中心性最高的前 5 个节点。
网络可视化
- 简单可视化:NetworkX 结合 Matplotlib 可实现网络的简单可视化。例如:
import networkx as nx
import matplotlib.pyplot as plt
graph = nx.Graph()
graph.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 1)])
pos = nx.spring_layout(graph)
nx.draw(graph, pos, with_labels = True)
plt.show()
nx.spring_layout计算节点的布局位置,nx.draw根据布局绘制网络,with_labels = True表明显示节点标签,最后通过plt.show()展示图形。
2. 个性化可视化:可以根据节点和边的属性对可视化进行个性化设置。列如根据节点的度来设置节点大小,根据边的权重设置边的宽度:
import networkx as nx
import matplotlib.pyplot as plt
graph = nx.Graph()
graph.add_edges_from([(1, 2, {'weight': 2}), (2, 3, {'weight': 3}), (3, 4, {'weight': 1}), (4, 1, {'weight': 4})])
pos = nx.spring_layout(graph)
node_sizes = [graph.degree(node) * 200 for node in graph.nodes()]
edge_widths = [graph.edges[edge]['weight'] for edge in graph.edges()]
nx.draw(graph, pos, with_labels = True, node_size = node_sizes, width = edge_widths)
plt.show()
这里根据节点度计算节点大小,根据边的权重计算边的宽度,使得可视化图形更直观地反映网络特征。
应用场景
- 社交网络分析:通过 NetworkX 分析社交网络数据,可了解用户影响力、社群结构等。例如,找出社交网络中的关键人物,分析信息传播路径。
- 生物网络研究:在生物学中,用于研究蛋白质 – 蛋白质相互作用网络、代谢网络等,探索生物系统的功能和机制。
每天坚持学习一点点,不求有回报,只愿可以丰富自己!!!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
