用python实现实现具有固定连边概率的 ER 随机网络模型、WS 网络模型 以及 BA 无标度网络模型,各生成一个网络并进行持久化储存,并且计算度分布,聚集系数分布,介数分布,距离分布,并且绘制成分布图
时间: 2024-05-13 19:17:06 浏览: 169
基于python的数据分析与预测
5星 · 资源好评率100%
好的,我可以帮你实现这个需求。首先,我们需要安装一些必要的库,包括 networkx, matplotlib 和 numpy。你可以使用以下命令来安装它们:
```
pip install networkx matplotlib numpy
```
接下来,我们分别来实现 ER、WS 和 BA 模型。
## ER 随机网络模型
ER 模型是一个随机图模型,其中每个节点都有相同的概率与其他节点相连。我们可以使用 NetworkX 库来生成 ER 模型:
```python
import networkx as nx
n = 1000 # 节点数
p = 0.1 # 连边概率
G = nx.erdos_renyi_graph(n, p)
```
这里我们生成了一个包含 1000 个节点,每个节点有 0.1 的概率与其他节点相连的 ER 模型。接下来,我们可以计算度分布、聚集系数分布、介数分布以及距离分布:
```python
import matplotlib.pyplot as plt
import numpy as np
# 计算度分布
degree_sequence = sorted([d for n, d in G.degree()], reverse=True)
degree_count = np.array([(degree_sequence.count(i)/float(nx.number_of_nodes(G))) for i in range(max(degree_sequence)+1)])
# 计算聚集系数分布
clustering_sequence = sorted(list(nx.clustering(G).values()), reverse=True)
clustering_count = np.array([(clustering_sequence.count(i)/float(nx.number_of_nodes(G))) for i in set(clustering_sequence)])
# 计算介数分布
betweenness_sequence = sorted(list(nx.betweenness_centrality(G).values()), reverse=True)
betweenness_count = np.array([(betweenness_sequence.count(i)/float(nx.number_of_nodes(G))) for i in set(betweenness_sequence)])
# 计算距离分布
dist_sequence = sorted([d for n, d in nx.all_pairs_shortest_path_length(G)], reverse=True)
dist_count = np.array([(dist_sequence.count(i)/float(nx.number_of_nodes(G))) for i in range(max(dist_sequence)+1)])
```
最后,我们可以将这些分布绘制成图表:
```python
# 绘制度分布图
plt.plot(degree_count, 'b-', marker='o')
plt.title('Degree distribution')
plt.xlabel('Degree')
plt.ylabel('Fraction of nodes')
plt.show()
# 绘制聚集系数分布图
plt.plot(clustering_count, 'r-', marker='o')
plt.title('Clustering coefficient distribution')
plt.xlabel('Clustering coefficient')
plt.ylabel('Fraction of nodes')
plt.show()
# 绘制介数分布图
plt.plot(betweenness_count, 'g-', marker='o')
plt.title('Betweenness centrality distribution')
plt.xlabel('Betweenness centrality')
plt.ylabel('Fraction of nodes')
plt.show()
# 绘制距离分布图
plt.plot(dist_count, 'm-', marker='o')
plt.title('Distance distribution')
plt.xlabel('Distance')
plt.ylabel('Fraction of node pairs')
plt.show()
```
## WS 网络模型
WS 模型是一个小世界网络模型,其中每个节点有一个固定数量的邻居,但是有一定的概率会重新连接到其他随机节点。我们可以使用 NetworkX 库来生成 WS 模型:
```python
import networkx as nx
n = 1000 # 节点数
k = 10 # 邻居数量
p = 0.1 # 重新连接概率
G = nx.watts_strogatz_graph(n, k, p)
```
这里我们生成了一个包含 1000 个节点,每个节点有 10 个邻居,并且有 0.1 的概率重新连接到其他随机节点的 WS 模型。接下来,我们可以计算度分布、聚集系数分布、介数分布以及距离分布,方式与前面的 ER 模型相同。
## BA 无标度网络模型
BA 模型是一个无标度网络模型,其中每个节点有一个固定数量的连边,每次加入一个新节点时,它会连接到已有节点中度数最高的节点。我们可以使用 NetworkX 库来生成 BA 模型:
```python
import networkx as nx
n = 1000 # 节点数
m = 5 # 连边数量
G = nx.barabasi_albert_graph(n, m)
```
这里我们生成了一个包含 1000 个节点,每个节点有 5 条连边的 BA 模型。接下来,我们可以计算度分布、聚集系数分布、介数分布以及距离分布,方式与前面的 ER 模型相同。
最后,我们可以将这些网络模型持久化储存:
```python
nx.write_gml(G_er, 'er.gml')
nx.write_gml(G_ws, 'ws.gml')
nx.write_gml(G_ba, 'ba.gml')
```
完整代码如下:
阅读全文