提交 bd76a582 编写于 作者: W wizardforcel

3.7

上级 e8316470
......@@ -240,3 +240,78 @@ def characteristic_path_length(G):
这个例子中,所有三个节点都互相连接,所以平均长度为 1。
## 3.7 WS 实验
![](img/3-3.jpg)
> 图 3.3:WS 图的群聚系数`C`和特征路径长度`L`,其中`n=1000, k=10`,`p`是一个范围。
现在我们准备复制 WS 实验,它表明对于一系列`p`值,WS 图具有像正则图像那样的高群聚性,像随机图一样的短路径长度。
我将从`run_one_graph`开始,它接受`n``k``p`;它生成具有给定参数的 WS图,并计算平均路径长度`mpl`和群聚系数`cc`
```py
def run_one_graph(n, k, p):
ws = make_ws_graph(n, k, p)
mpl = characteristic_path_length(ws)
cc = clustering_coefficient(ws)
print(mpl, cc)
return mpl, cc
```
sssss
Watts 和 Strogatz 用`n = 1000``k = 10`进行实验。使用这些参数,`run_one_graph`在我的电脑上需要大约一秒钟;大部分时间用于计算平均路径长度。
现在我们需要为范围内的`p`计算这些值。我将再次使用 NumPy 函数`logspace`来计算`ps`
```py
ps = np.logspace(-4, 0, 9)
```
对于每个`p`的值,我生成了 3 个随机图,并且我们将结果平均。这里是运行实验的函数:
```py
def run_experiment(ps, n=1000, k=10, iters=3):
res = {}
for p in ps:
print(p)
res[p] = []
for _ in range(iters):
res[p].append(run_one_graph(n, k, p))
return res
```
结果是个字典,将每个`p`值映射为`(mpl, cc)`偶对的列表。
最后一步就是聚合结果:
```py
L = []
C = []
for p, t in sorted(res.items()):
mpls, ccs = zip(*t)
mpl = np.mean(mpls)
cc = np.mean(ccs)
L.append(mpl)
C.append(cc)
```
每次循环时,我们取得一个`p`值和一个`(mpl, cc)`偶对的列表。 我们使用`zip`来提取两个列表,`mpls``ccs`,然后计算它们的均值并将它们添加到`L``C`,这是路径长度和群聚系数的列表。
为了在相同的轴上绘制`L``C`,我们通过除以第一个元素,将它们标准化:
```py
L = np.array(L) / L[0]
C = np.array(C) / C[0]
```
图(?)展示了结果。 随着`p`的增加,平均路径长度迅速下降,因为即使少量随机重新布线的边,也提供了图区域之间的捷径,它们在格中相距很远。另一方面,删除局部链接降低了群聚系数,但是要慢得多。
因此,存在较宽范围的`p`,其中 WS 图具有小世界图的性质,高群聚度和短路径长度。
这就是为什么 Watts 和 Strogatz 提出了 WS 图,作为展示小世界现象的,现实世界网络的模型。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册