добавление членства в группе в качестве атрибута узла после моделирования сети в iGraph - PullRequest
0 голосов
/ 15 апреля 2020

Я создал смоделированную сеть (через SBM) пакета igraph в R:

    library(igraph)
    pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
    g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                    directed = FALSE, loops = FALSE)

Матрица смежности графа g подтверждает, что узлы 1-5 считаются одной группой, а узлы 6-10 считаются другой группой.

> as_adj(g)
 [1,] . 1 . 1 . . . . . .
 [2,] 1 . 1 1 . . . . . .
 [3,] . 1 . 1 1 . . . . .
 [4,] 1 1 1 . 1 . . . . .
 [5,] . . 1 1 . . . . . .
 [6,] . . . . . . 1 1 . 1
 [7,] . . . . . 1 . 1 1 1
 [8,] . . . . . 1 1 . 1 .
 [9,] . . . . . . 1 1 . 1
[10,] . . . . . 1 1 . 1 .

Но полученный объект igraph, созданный моим sample_sbm вызовом, не включает членство в группе как атрибут вершины.

> g
IGRAPH 8750fb0 U--- 10 15 -- Stochastic block-model
+ attr: name (g/c), loops (g/l)
+ edges from 8750fb0:
 [1] 1-- 2 2-- 3 1-- 4 2-- 4 3-- 4 3-- 5 4-- 5 6-- 7 6-- 8 7-- 8 7-- 9 8-- 9 6--10 7--10 9--10

Как добавить эту информацию для построения и анализ?

1 Ответ

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

Если ваш выбранный граф содержит два отдельных компонента без общих ребер (как в приведенном вами примере), вы можете использовать components()$membership, чтобы получить членство в группе и назначить его атрибуту узла:

library(igraph)

set.seed(1234)

pr_mat <- cbind(c(0.5,0.001), c(0.001, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                directed = FALSE, loops = FALSE)

V(g)$group <- components(g)$membership

plot(g, vertex.color = V(g)$group)

Это работает только потому, что указанная вами матрица предпочтений создает два отдельных компонента. Если между блоками есть ребра, то, очевидно, в графе есть только один компонент. В этом случае вы можете использовать одну из cluster_*() функций:

set.seed(1234)

pr_mat <- cbind(c(0.5,0.1), c(0.1, 0.5))
g <- sample_sbm(10, pref.matrix = pr_mat, block.sizes = c(5,5), 
                directed = FALSE, loops = FALSE)

V(g)$group <- cluster_louvain(g)$membership

plot(g, vertex.color = V(g)$group)

Создано в 2020-04-14 пакетом представ (v0.3.0)

...