Произвольно генерировать сеть с указанным коэффициентом кластеризации - PullRequest
2 голосов
/ 31 марта 2020

В прошлом я использовал igraph для генерации сетей небольшого мира с заданной вероятностью перемонтирования p, что особенно легко, потому что это аргумент в функции sample_smallworld. Например:

myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = 0.25)
plot(myNetwork, layout = layout_in_circle)

Теперь я хотел бы создать сети небольшого мира с указанным коэффициентом кластеризации. Я новичок в igraph, и это похоже на функциональность, которую он имел бы, но после некоторого поиска я нашел только способы для вычисления коэффициента из уже существующих сетей, а не способ использовать его в качестве параметра для Генерация самой сети.

Каков наилучший способ создания сетей с указанным коэффициентом кластеризации?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Если у вас все в порядке с несколькими условиями, то можно получить своего рода хакерское приближение, используя sna::rguman(). Условия: (1) использование глобальной транзитивности (возможно, вы могли бы работать с ней и изменить); (2) использование неориентированных графов; (3) использование графиков большого размера, если используются небольшие значения транзитивности, или используйте большие значения транзитивности для графиков малого размера. Также откажитесь от алгоритма sample_smallworld(). Если это нормально, это может привести вас туда, куда вы хотите go:

library(sna)
library(igraph)

sample_cluster <- function(nv = 150, clustering_coef = 0.5, thres = 0.05) {
  g <- sna::rguman(1, nv, mut = clustering_coef, asym = 0, null = 1 - clustering_coef) %>% 
    graph_from_adjacency_matrix(mode = "undirected")

  while (!(transitivity(g) >= clustering_coef-thres & transitivity(g) <= clustering_coef+thres)) {
    g <- sna::rguman(1, nv, mut = clustering_coef, asym = 0, null = 1 - clustering_coef) %>% 
      graph_from_adjacency_matrix(mode = "undirected")
  }

  return(g)

} 


sample_cluster(15, clustering_coef = 0.2, thres = 0.001) %>% transitivity()
#> [1] 0.2

sample_cluster(200, clustering_coef = 0.01, thres = 0.001) %>% transitivity()
#> [1] 0.009009009

sample_cluster(200, clustering_coef = 0.2, thres = 0.001) %>% transitivity()
#> [1] 0.2007628

sample_cluster(20, clustering_coef = 0.7, thres = 0.001) %>% transitivity()
#> [1] 0.7007168

Создано в 2020-03-31 пакетом prex (v0.3.0)

Не причудливый, не изощренный, но может сделать свое дело!

1 голос
/ 31 марта 2020

Насколько я понимаю, вы не можете указать коэффициент кластеризации (или транзитивность, как он назван в пакете igraph), потому что он зависит от указанных вами параметров.

Почему? sample_smallworld создает график в соответствии с моделью Ватта-Строгатца, как объяснено в документации . Проверьте математику модели в Wikipedia . Модель Ваттса-Строгатца имеет три параметра:

  1. Количество узлов (параметр size в методе sample_smallworld, N в статье в Википедии);
  2. Среднее число ссылок на узел (nei параметр, K в Википедии);
  3. Вероятность подключения случайной пары узлов для каждой ссылки в графе через «перемонтирование» (p параметр, бета в Википедии).

Взгляните на Википедию (раздел «Коэффициент кластеризации»), чтобы понять, как из этих параметров можно рассчитать коэффициент кластеризации. .

Более эмпирически, если вы поэкспериментируете с параметрами в вашей модели, вы можете увидеть, как они влияют на коэффициент кластеризации с помощью команды transitivity.

# clustering coefficient in your data:

myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = 0.25)
transitivity(myNetwork)
[1] 0.3870968
# Varying average links/node:

for(i in 1:5) {
  set.seed(1) # use this to get the same results
  myNetwork <- sample_smallworld(dim = 1, size = 10, nei = i, p = 0.25)
  print(transitivity(myNetwork, type="global"))
}

[1] 0
[1] 0.2380952
[1] 0.6
[1] 0.8723404
[1] 1

# Varying rewiring probability:

for(i in c(0.05, 0.1, 0.2, 0.5, 1)) {
  set.seed(1)
  myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = i)
  print(transitivity(myNetwork, type="global"))
}
[1] 0.483871
[1] 0.4615385
[1] 0.328125
[1] 0.3802817
[1] 0.4347826
...