Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
think-comp-2e-zh
提交
8af3a809
T
think-comp-2e-zh
项目概览
OpenDocCN
/
think-comp-2e-zh
大约 1 年 前同步成功
通知
0
Star
16
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
think-comp-2e-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8af3a809
编写于
10月 30, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2.6~2.7
上级
b83ea5de
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
105 addition
and
2 deletion
+105
-2
2.md
2.md
+105
-2
img/2-4.png
img/2-4.png
+0
-0
img/2-5.png
img/2-5.png
+0
-0
img/2-6.png
img/2-6.png
+0
-0
未找到文件。
2.md
浏览文件 @
8af3a809
...
...
@@ -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 在其论文中证明的结果一致。
img/2-4.png
0 → 100644
浏览文件 @
8af3a809
8.4 KB
img/2-5.png
0 → 100644
浏览文件 @
8af3a809
3.9 KB
img/2-6.png
0 → 100644
浏览文件 @
8af3a809
7.0 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录