提交 8af3a809 编写于 作者: W wizardforcel

2.6~2.7

上级 b83ea5de
......@@ -168,7 +168,7 @@ Erdős-Rényi 图(ER 图)的特征在于两个参数:`n`是节点的数量
Erdős 和 Rényi 研究了这些随机图的属性;其令人惊奇的结果之一就是,随着随机的边被添加,随机图的属性会突然变化。
展示这类转的一个属性是连通性。如果每个节点到每个其他节点都存在路径,那么无向图是连通的。
展示这类转的一个属性是连通性。如果每个节点到每个其他节点都存在路径,那么无向图是连通的。
在 ER 图中,当`p`较小时,图是连通图的概率非常低,而`p`较大时接近`1`。在这两种状态之间,在`p`的特定值处存在快速转变,表示为`p*`
......@@ -180,7 +180,7 @@ Erdős 和 Rényi 表明,这个临界值是`p* = lnn / n`,其中`n`是节点
![](img/2-3.png)
我将首先生成一个完整的图,这是一个图,其中每个节点都彼此连接。
我将首先生成一个完图,这是一个图,其中每个节点都彼此连接。
这是一个生成器函数,它接收节点列表并枚举所有不同的偶对。如果你不熟悉生成器函数,你可能需要阅读附录?,然后回来。
......@@ -301,4 +301,107 @@ True
下一节中,我们会生成 ER 图,并检查它们是否是连通的。
## 2.6 生成 ER图
![](img/2-4.png)
> 图 2.4:ER 图,`n=10`,`p=0.3`
ER 图`G(n, p) `包含`n`个节点,每对节点以概率为`p`的边连接。生成 ER 图类似于生成完全图。
以下生成器函数枚举所有可能的边,并使用辅助函数`flip`,来选择哪些应添加到图中:
```py
def random_pairs(nodes, p):
for i, u in enumerate(nodes):
for j, v in enumerate(nodes):
if i>j and flip(p):
yield u, v
```
`flip`以给定概率`p`返回`True`,以互补的概率`1-p`返回`False`
```py
from numpy.random import random
def flip(p):
return random() < p
```
最后,`make_random_graph`生成并返回 ER 图`G(n, p)`
```py
def make_random_graph(n, p):
G = nx.Graph()
nodes = range(n)
G.add_nodes_from(nodes)
G.add_edges_from(random_pairs(nodes, p))
return G
```
`make_random_graph`几乎和`make_complete_graph`,唯一的不同是它使用`random_pairs`而不是`all_pairs`
这里是`p=0.3`的例子:
```py
random_graph = make_random_graph(10, 0.3)
```
图(?)展示了结果。这个图是连通图;事实上,大多数`p=10`并且`p=3`的 ER 图都是连通图。在下一节中,我们将看看有多少。
## 2.7 连通性的概率
![](img/2-5.png)
> 图 2.5:连通性的概率,`n=10`,`p`是一个范围。竖直的线展示了预测的临界值。
![](img/2-6.png)
>图 2.6:连通性的概率,`n`是多个值,`p`是一个范围。
对于`n``p`的给定值,我们想知道`G(n, p)`连通的概率。我们可以通过生成大量随机图,来计算有多少个来估计它。就是这样:
```py
def prob_connected(n, p, iters=100):
count = 0
for i in range(iters):
random_graph = make_random_graph(n, p)
if is_connected(random_graph):
count += 1
return count/iters
```
`iters`是我们生成的随机图的数量。随着我们增加`iter`,估计的概率就会更加准确。
```py
>>> prob_connected(10, 0.3, iters=10000)
0.6454
```
在具有这些参数的 10000 个 ER 图中,6498 个是连通的,因此我们估计其中65%是连通的。所以 0.3 接近临界值,在这里连通概率从接近 0 变为接近 1。根据 Erdős 和 Rényi,`p* = lnn / n = 0.23`
我们可以通过估计一系列`p`值的连通概率,来更清楚地了解转变:
```py
import numpy as np
n = 10
ps = np.logspace(-2.5, 0, 11)
ys = [prob_connected(n, p) for p in ps]
```
这是我们看到的使用 NumPy 的第一个例子。按照惯例,我将 NumPy 导入为`np`。函数`logspace`返回从`10 ** -2.5``10 ** 0 = 1`的 11 个元素的数组,在对数刻度上等间隔。
为了计算`y`,我使用列表推导来迭代`ps`的元素,并计算出每个值为`p`的随机图的连通概率。
图(?)展示了结果,竖直的线为`p*`。从 0 到 1 的转变发生在预测的临界值附近。在对数刻度上,这个转变大致对称。
对于较大的`n`值,图(?)展示了类似的结果。随着`n`的增加,临界值越来越小,转变越来越突然。
这些实验与 Erdős 和 Rényi 在其论文中证明的结果一致。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册