Правильный подход к расчету кластеризации на уровне вершин

Я пытаюсь рассчитать кластеризацию каждой вершины в моем графе, где кластеризация определяется на уровне вершины как процент фактически сформированных возможных связей между соседями (например, если вершина i имеет 4 соседа, существует шесть возможных ссылок). между соседями).

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

Однако я не смог найти готовую функцию для вычисления этого с помощью igraph. Обе функции clusters и cluster.distribution, похоже, имеют дело с тем, что я бы назвал «компонентами», и, насколько я могу судить, это просто псевдонимы для components и component.distribution соответственно.

Например, для g = make_graph("Bull") кластеризация по вершине такова:

v |  c
-------
1 |  1
2 | 1/3
3 | 1/3
4 | 0 [by convention]
5 | 0 [by convention]

Я мог бы получить это со следующим

library(igraph)
g = make_graph("Bull")
sapply(adjacent_vertices(g, seq_len(vcount(g))), 
       function(x) {
         neigh = as.vector(x)
         if (length(neigh) <= 1L) return(0)
         sum(g[neigh, neigh])/
           (length(neigh)^2 - length(neigh))})
# [1] 1.0000000 0.3333333 0.3333333 0.0000000 0.0000000

Но это кажется многословным и, вероятно, неэффективным.

Есть ли более канонический способ сделать это с помощью igraph?


person MichaelChirico    schedule 10.12.2016    source источник


Ответы (1)


Это отражает коэффициент кластеризации. В igraph вызов transitivity. Используйте "local" в качестве аргумента type. Вы также можете указать, хотите ли вы 0s или NAs для изолятов:

library(igraph)
g = make_graph("Bull")
transitivity(g, type="local")
# [1] 1.0000000 0.3333333 0.3333333       NaN       NaN
transitivity(g, type="local", isolates = "zero")
# [1] 1.0000000 0.3333333 0.3333333 0.0000000 0.0000000
person paqmo    schedule 11.12.2016