ER随机图的度分布

1. ER 网络的两种生成方法以及Python 的实现

2. ER 网络的度分布;当 n  趋近无穷 度分布

3. Binomial distribution  & Poisson distribution  的分布、本质、均值、方差.

 

20世纪50年代末由两位匈牙利数学家Erdos和Renyi建立的随机图理论(Random graph theory)被公认是在数学上开创了复杂网络拓扑结构的系统性分析。

其中Erdos是一位颇具传奇色彩的数学家,他一生巡回世界,每到一个地方就跟当地的数学家讨论研究,写文章。他先后发表过一千多篇数学论文,被称为最多产的数学家。

 

Erdos

ER随机图有两种构建方式:

(1)G(N,M),先确定N个点,然后向这N个点之间撒M条边;

(2)G(N,p),也是先确定N个点,任意两个不同的节点之间的连边概率是p;

随机图可以通过Python下的一个编程包实现(不止随机图了,很多复杂网络的算法都有包括,下载地址:https://pypi.python.org/pypi/networkx/)

 

100个节点,p=0.03

 

100个节点,p=0.03

ER随机图的度分布:

 

度分布

很好理解,一个点的度为k的概率(有k个点与之相连),就在除它本身之外的(N-1)个点选k个和它相连,剩下(N-1-k)和它不连。所以是个二项分布。

二项分布可以由泊松分布近似:

 

二项分布泊松近视

这里的<k>=p(N-1),为度的均值。

用Python出四个图,<k>=15的时候对应100个节点,1000个节点,10000个节点和100000个节点的情况。

 

代码

 

nodes=100

 

nodes=1000

 

nodes=10000

 

nodes=100000

在10000个节点的时候已经非常接近了,数量级达到100000的时候就非常契合了。

在N非常大(大于10000)的时候,ER随机图的度分布可以由泊松分布来刻画。



作者:鹿生鲜
链接:https://www.jianshu.com/p/7b2f65585438
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你实现这个需求。首先,我们需要安装一些必要的库,包括 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') ``` 完整代码如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值