-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path02-ER.Rmd
More file actions
97 lines (88 loc) · 2.68 KB
/
02-ER.Rmd
File metadata and controls
97 lines (88 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# 随机网络
*根据不同的N和P值生成ER随机网络,并且统计相关性质的变化*
我们选取了N为100、500、1000的三种情况,并对三种情况分别生成平均度为1,10和15的ER随机网络。表\@ref(tab:config-ER)给出了ER随机网络配置情况,图\@ref(fig:visualize-ER)则给出了每种配置的ER随机网络的可视化图形。
```{r define-ER-generation}
generate_random_network <- function(n, p) {
expand_grid(n1 = 1:n, n2 = 1:n) %>%
filter(n1 < n2) %>%
mutate(
connected = if_else(
runif(nrow(.)) < p,
TRUE, FALSE
)
) %>%
filter(connected) %>%
select(n1, n2) %>%
as.matrix() %>%
graph_from_edgelist(directed = FALSE)
}
```
```{r config-ER}
config_er <- expand_grid(
tibble(
mean_k = c(1, 10, 15)
),
n = c(100, 500, 1000)
) %>%
mutate(p = mean_k / n)
config_er %>%
select(n, p, mean_k) %>%
knitr::kable(
digits = 4,
col.names = c("$N$", "$p$", "$<k>$"),
caption = "ER随机网络类型配置"
)
```
```{r generate-ER, cache=TRUE}
set.seed(20191112)
random_graphs <- config_er %>%
mutate(
graph = map2(
n, p, generate_random_network
)
)
```
```{r visualize-ER, fig.width=6, fig.height=4, fig.cap="可视化ER随机网络"}
par(mar = c(0, 0, 2, 0) + 0.1, mfrow = c(3, 3))
for (i_row in 1:nrow(random_graphs)) {
with(
random_graphs,
plot(
graph[[i_row]],
layout = layout_nicely,
vertex.color = "black",
vertex.size = 1,
vertex.label = NA,
edge.curved = 0,
main = str_c("N: ", n[i_row], ", p: ", round(p[i_row], 4))
)
)
}
```
图\@ref(fig:degree-distribution-ER)画出了每种ER随机网络的度分布图,以及与其度分度的渐进分布的比较。可以看出来,随着节点数的增加,ER随机网络的度分度越来越接近$\lambda$值(平均值)等于度分布的泊松分布。
```{r degree-distribution-ER, fig.height=4, fig.width=6, fig.cap="不同随机网络的度分布[^1]"}
random_graphs %>%
mutate(
dat_plt = map2(
graph, mean_k,
~ tibble(
freq = degree_distribution(.x),
k = seq(0, by = 1, length.out = length(freq)),
freq_expected = dpois(k, .y)
)
)
) %>%
unnest(dat_plt) %>%
mutate(
n = str_c("N: ", n) %>%
factor(levels = c("N: 100", "N: 500", "N: 1000")),
mean_k = str_c("<k>: ", mean_k)
) %>%
ggplot(aes(k, freq)) +
geom_point(color = "blue", size = 1) +
geom_line(aes(y = freq_expected), color = "lightblue") +
facet_grid(n ~ mean_k, scales = "free") +
labs(y = "P(k)") +
theme_few()
```
[^1]: 其中浅蓝色线是$\lambda$等于平均度$<k>$的泊松分布(即相应随机网络的渐进分布)。