Este tutorial tem como objetivo demonstrar como criar grafos a partir de uma matriz de similaridade no contexto da classificação multirrótulo. Neste tutorial, a matriz de similaridade usada foi calculada usando apenas o espaço de rótulos do dataset multirrótulo. Isto significa que foi calculada a similaridade entre os pares de rotulos.
Se um dataset tem 4 rótulos, então obtém-se 16 pares de rótulos. Como consequência a matriz de similariade terá tamanho 4 x 4 e em cada uma das 16 posições da matriz estarão os valores calculados para cada par.
Um grafo é composto por um conjunto de vértices e arestas. Transpondo isto para o contexto deste tutorial, temos que os vértices são os rótulos do espaço de rótulos, e as arestas são as similaridades calculadas entre cada par de rótulos, algo como o exemplo abaixo:
v_origem = c("rotulo1", "rotulo1", "rotulo2", "rotulo2")
v_destino = c("rotulo1", "rotulo2","rotulo1", "rotulo2")
aresta = c(1.0, 0.5, 0.6, 1.0)
peso = c(0.2, 1.0, 0.3, 0.8)
df_grafo = data.frame(v_origem, v_destino, aresta, peso)
df_grafo## v_origem v_destino aresta peso
## 1 rotulo1 rotulo1 1.0 0.2
## 2 rotulo1 rotulo2 0.5 1.0
## 3 rotulo2 rotulo1 0.6 0.3
## 4 rotulo2 rotulo2 1.0 0.8
# workspace directory
setwd("~/Hands-On-Igraph-R")
library(igraph)##
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
## The following object is masked from 'package:base':
##
## union
library(tidyr)##
## Attaching package: 'tidyr'
## The following object is masked from 'package:igraph':
##
## crossing
library(plyr)
library(dplyr)##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:plyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following objects are masked from 'package:igraph':
##
## as_data_frame, groups, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Existe uma forma correta de data frame que deve ser usado para construir o grafo. Ele é composto de quatro colunas: vértice de origem, vértice de destino e valor da aresta. É este data frame que vamos aprender construir neste tutorial.
Para cada dataset que trabalho, eu separo os rótulos originais em um arquivo “csv”. Desta foram eu uso estes nomes em todas as manipulações de rótulos que preciso fazer no meu código. Esta é uma forma de garantir que outras funções não alterem os nomes das colunas, como por exemplo, substituir pontos por traços, ou algo do tipo. Aqui vou utilizar o dataset BIRDS que possui 19 rótulos.
names_labes = read.csv("~/Hands-On-Igraph-R/data/birds-dataset/NamesLabels/birds-NamesLabels.csv")
names_labes## N Labels
## 1 1 Brown.Creeper
## 2 2 Pacific.Wren
## 3 3 Pacific.slope.Flycatcher
## 4 4 Red.breasted.Nuthatch
## 5 5 Dark.eyed.Junco
## 6 6 Olive.sided.Flycatcher
## 7 7 Hermit.Thrush
## 8 8 Chestnut.backed.Chickadee
## 9 9 Varied.Thrush
## 10 10 Hermit.Warbler
## 11 11 Swainson.s.Thrush
## 12 12 Hammond.s.Flycatcher
## 13 13 Western.Tanager
## 14 14 Black.headed.Grosbeak
## 15 15 Golden.Crowned.Kinglet
## 16 16 Warbling.Vireo
## 17 17 MacGillivray.s.Warbler
## 18 18 Stellar.s.Jay
## 19 19 Common.Nighthawk
Como as medidas de similaridades já foram calculadas, então, basta abrir os arquivos csvs.
# abrindo o arquivo
df_jaccard = read.csv("~/Hands-On-Igraph-R/data/birds-similarities/Split-1/jaccard-2.csv")
head(df_jaccard)## X Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 Brown.Creeper 1.00000000 0.00000000 0.04255319
## 2 Pacific.Wren 0.00000000 1.00000000 0.10752688
## 3 Pacific.slope.Flycatcher 0.04255319 0.10752688 1.00000000
## 4 Red.breasted.Nuthatch 0.00000000 0.00000000 0.04651163
## 5 Dark.eyed.Junco 0.00000000 0.00000000 0.03846154
## 6 Olive.sided.Flycatcher 0.04545455 0.02666667 0.04166667
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher Hermit.Thrush
## 1 0.00000000 0.00000000 0.04545455 0.000000000
## 2 0.00000000 0.00000000 0.02666667 0.009708738
## 3 0.04651163 0.03846154 0.04166667 0.054794521
## 4 1.00000000 0.00000000 0.05555556 0.000000000
## 5 0.00000000 1.00000000 0.00000000 0.122448980
## 6 0.05555556 0.00000000 1.00000000 0.085106383
## Chestnut.backed.Chickadee Varied.Thrush Hermit.Warbler Swainson.s.Thrush
## 1 0.07500000 0.05263158 0.05882353 0.00000000
## 2 0.04301075 0.04587156 0.04854369 0.12121212
## 3 0.07692308 0.14473684 0.06578947 0.09009009
## 4 0.05405405 0.03703704 0.00000000 0.00000000
## 5 0.04347826 0.08333333 0.05357143 0.10000000
## 6 0.02325581 0.01666667 0.05769231 0.04395604
## Hammond.s.Flycatcher Western.Tanager Black.headed.Grosbeak
## 1 0.00000000 0.00000000 0
## 2 0.17333333 0.10843373 0
## 3 0.03389831 0.00000000 0
## 4 0.00000000 0.00000000 0
## 5 0.02631579 0.02380952 0
## 6 0.00000000 0.11428571 0
## Golden.Crowned.Kinglet Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 1 0.02500000 0.00000000 0 0.00000000
## 2 0.02150538 0.00000000 0 0.02816901
## 3 0.07936508 0.01960784 0 0.00000000
## 4 0.00000000 0.00000000 0 0.00000000
## 5 0.04545455 0.07142857 0 0.00000000
## 6 0.00000000 0.00000000 0 0.00000000
## Common.Nighthawk
## 1 0.00000000
## 2 0.01176471
## 3 0.00000000
## 4 0.00000000
## 5 0.00000000
## 6 0.00000000
Quando abrimos o arquivos, notaremos que a primeira coluna contem os nomes dos rótulos. O ideal é que as linhas do data frame contenham esses nomes e esta primeira coluna seja apagada. Assim, as colunas e linhas do data frame ficam nomeadas corretamente e o conteúdo do data frame será composto apenas pelos valores das similaridades.
# nomeando as linhas
rownames(df_jaccard) = df_jaccard$X
# apagando a primeira coluna
df_jaccard = df_jaccard[,-1]
head(df_jaccard)## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## Brown.Creeper 1.00000000 0.00000000 0.04255319
## Pacific.Wren 0.00000000 1.00000000 0.10752688
## Pacific.slope.Flycatcher 0.04255319 0.10752688 1.00000000
## Red.breasted.Nuthatch 0.00000000 0.00000000 0.04651163
## Dark.eyed.Junco 0.00000000 0.00000000 0.03846154
## Olive.sided.Flycatcher 0.04545455 0.02666667 0.04166667
## Red.breasted.Nuthatch Dark.eyed.Junco
## Brown.Creeper 0.00000000 0.00000000
## Pacific.Wren 0.00000000 0.00000000
## Pacific.slope.Flycatcher 0.04651163 0.03846154
## Red.breasted.Nuthatch 1.00000000 0.00000000
## Dark.eyed.Junco 0.00000000 1.00000000
## Olive.sided.Flycatcher 0.05555556 0.00000000
## Olive.sided.Flycatcher Hermit.Thrush
## Brown.Creeper 0.04545455 0.000000000
## Pacific.Wren 0.02666667 0.009708738
## Pacific.slope.Flycatcher 0.04166667 0.054794521
## Red.breasted.Nuthatch 0.05555556 0.000000000
## Dark.eyed.Junco 0.00000000 0.122448980
## Olive.sided.Flycatcher 1.00000000 0.085106383
## Chestnut.backed.Chickadee Varied.Thrush Hermit.Warbler
## Brown.Creeper 0.07500000 0.05263158 0.05882353
## Pacific.Wren 0.04301075 0.04587156 0.04854369
## Pacific.slope.Flycatcher 0.07692308 0.14473684 0.06578947
## Red.breasted.Nuthatch 0.05405405 0.03703704 0.00000000
## Dark.eyed.Junco 0.04347826 0.08333333 0.05357143
## Olive.sided.Flycatcher 0.02325581 0.01666667 0.05769231
## Swainson.s.Thrush Hammond.s.Flycatcher Western.Tanager
## Brown.Creeper 0.00000000 0.00000000 0.00000000
## Pacific.Wren 0.12121212 0.17333333 0.10843373
## Pacific.slope.Flycatcher 0.09009009 0.03389831 0.00000000
## Red.breasted.Nuthatch 0.00000000 0.00000000 0.00000000
## Dark.eyed.Junco 0.10000000 0.02631579 0.02380952
## Olive.sided.Flycatcher 0.04395604 0.00000000 0.11428571
## Black.headed.Grosbeak Golden.Crowned.Kinglet
## Brown.Creeper 0 0.02500000
## Pacific.Wren 0 0.02150538
## Pacific.slope.Flycatcher 0 0.07936508
## Red.breasted.Nuthatch 0 0.00000000
## Dark.eyed.Junco 0 0.04545455
## Olive.sided.Flycatcher 0 0.00000000
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## Brown.Creeper 0.00000000 0 0.00000000
## Pacific.Wren 0.00000000 0 0.02816901
## Pacific.slope.Flycatcher 0.01960784 0 0.00000000
## Red.breasted.Nuthatch 0.00000000 0 0.00000000
## Dark.eyed.Junco 0.07142857 0 0.00000000
## Olive.sided.Flycatcher 0.00000000 0 0.00000000
## Common.Nighthawk
## Brown.Creeper 0.00000000
## Pacific.Wren 0.01176471
## Pacific.slope.Flycatcher 0.00000000
## Red.breasted.Nuthatch 0.00000000
## Dark.eyed.Junco 0.00000000
## Olive.sided.Flycatcher 0.00000000
Os valores dos pesos que usaremos para construir o grafo ponderado também já foram calculados previamente, portanto, basta abrir o arquivo csv. Aqui também precisaremos nomear as linhas e apagar a primeira coluna.
# abrindo o csv
df_cd = read.csv("~/Hands-On-Igraph-R/data/birds-similarities/Split-1/birds-conditional-probabilities.csv")
head(df_cd)## X Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 Brown.Creeper 0.02148438 0.00000000 0.05263158
## 2 Pacific.Wren 0.00000000 0.12695312 0.26315789
## 3 Pacific.slope.Flycatcher 0.18181818 0.15384615 0.07421875
## 4 Red.breasted.Nuthatch 0.00000000 0.00000000 0.05263158
## 5 Dark.eyed.Junco 0.00000000 0.00000000 0.05263158
## 6 Olive.sided.Flycatcher 0.09090909 0.03076923 0.05263158
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher Hermit.Thrush
## 1 0.00000000 0.00000 0.08333333 0.00000000
## 2 0.00000000 0.00000 0.16666667 0.02564103
## 3 0.28571429 0.12500 0.16666667 0.10256410
## 4 0.01367188 0.00000 0.08333333 0.00000000
## 5 0.00000000 0.03125 0.00000000 0.15384615
## 6 0.14285714 0.00000 0.02343750 0.10256410
## Chestnut.backed.Chickadee Varied.Thrush Hermit.Warbler Swainson.s.Thrush
## 1 0.09375 0.06122449 0.06976744 0.00000000
## 2 0.12500 0.10204082 0.11627907 0.19277108
## 3 0.15625 0.22448980 0.11627907 0.12048193
## 4 0.06250 0.04081633 0.00000000 0.00000000
## 5 0.06250 0.10204082 0.06976744 0.10843373
## 6 0.03125 0.02040816 0.06976744 0.04819277
## Hammond.s.Flycatcher Western.Tanager Black.headed.Grosbeak
## 1 0.00000000 0.00000000 0
## 2 0.56521739 0.33333333 0
## 3 0.08695652 0.00000000 0
## 4 0.00000000 0.00000000 0
## 5 0.04347826 0.03703704 0
## 6 0.00000000 0.14814815 0
## Golden.Crowned.Kinglet Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 1 0.03333333 0.00000000 0 0.00
## 2 0.06666667 0.00000000 0 0.25
## 3 0.16666667 0.07142857 0 0.00
## 4 0.00000000 0.00000000 0 0.00
## 5 0.06666667 0.14285714 0 0.00
## 6 0.00000000 0.00000000 0 0.00
## Common.Nighthawk
## 1 0.00000000
## 2 0.04761905
## 3 0.00000000
## 4 0.00000000
## 5 0.00000000
## 6 0.00000000
# nomeando as linhas
rownames(df_cd) = df_cd$X
# apagando a primeira coluna
df_cd = df_cd[,-1] Precisa mos organizar os rótulos de forma que eles possam ser usados na conversão dos data frames originais para o data frame final (que é composto por apenas 4 colunas). A função a seguir gera os rótulos de que precisamos para preencher o data frame final.
A partir dos nomes dos rótulos originais, a função preenche um vetor com a ordem desses rótulos que serão repetidos em l(número de rótulos) posições, de forma que labels.pivot serão os vértices de origem do data frame final.
Assim, o primeiro rótulo será repetido 19 vezes, em seguida, o segundo rótulo repete-se 19 vezes, e assim por diante, até terminar o último rótulo.
Função
create.pivot.labels <- function(names_labes){
i = 1 # linha
j = 1 # coluna
a = 1 # célula
labels.pivot = c() # data frame
for(i in 1:19){
for(j in 1:19){
labels.pivot[a] = names_labes$Labels[i]
a = a + 1
}
}
return(labels.pivot)
}Usando a função
from = create.pivot.labels(names_labes)
head(from)## [1] "Brown.Creeper" "Brown.Creeper" "Brown.Creeper" "Brown.Creeper"
## [5] "Brown.Creeper" "Brown.Creeper"
Até agora obtivemos matrizes quadradas. O data frame para construir o grafo, no entanto, não é formatado desta maneira. Precisamos converter os data frames das matrizes de similaridade e dos pesos para uma tabela com apenas duas colunas. A primeira coluna conterá os rótulos e a segunda conterá os valores. Para isso, precisaremos usar a função pivot longer passando como parâmetro o data frame e o total de rótulos.
Usando pivot longer no data frame das similaridades
df_graph = data.frame(pivot_longer(df_jaccard, cols = 1:19))
head(df_graph)## name value
## 1 Brown.Creeper 1.00000000
## 2 Pacific.Wren 0.00000000
## 3 Pacific.slope.Flycatcher 0.04255319
## 4 Red.breasted.Nuthatch 0.00000000
## 5 Dark.eyed.Junco 0.00000000
## 6 Olive.sided.Flycatcher 0.04545455
# renomeia as colunas
colnames(df_graph) = c("to", "jaccard")Usando pivot longer no data frame dos pesos
weigths_total = data.frame(pivot_longer(df_cd, cols = 1:19))
head(weigths_total)## name value
## 1 Brown.Creeper 0.02148438
## 2 Pacific.Wren 0.00000000
## 3 Pacific.slope.Flycatcher 0.05263158
## 4 Red.breasted.Nuthatch 0.00000000
## 5 Dark.eyed.Junco 0.00000000
## 6 Olive.sided.Flycatcher 0.08333333
# renomeia a coluna
names(weigths_total)[2] = "weights"Agora finalmente podemos juntar todas as informações que precisamos para o data frame correto que será utilizado para construir o grafo. cbind é uma função que combina colunas.
df_graph = cbind(from, df_graph, weights = weigths_total$weights)
head(df_graph)## from to jaccard weights
## 1 Brown.Creeper Brown.Creeper 1.00000000 0.02148438
## 2 Brown.Creeper Pacific.Wren 0.00000000 0.00000000
## 3 Brown.Creeper Pacific.slope.Flycatcher 0.04255319 0.05263158
## 4 Brown.Creeper Red.breasted.Nuthatch 0.00000000 0.00000000
## 5 Brown.Creeper Dark.eyed.Junco 0.00000000 0.00000000
## 6 Brown.Creeper Olive.sided.Flycatcher 0.04545455 0.08333333
A esparsificação tem como objetivo remover arestas que não agregam valor ao grafo. Esta é a parte da modelagem do grafo propriamente dito. O que for definido aqui se refletirá nos métodos de detecção de comunidades.
Esparsificação por threshold significa retirar arestas que estejam acima ou abaixo de um determinado valor.
Ordenando o data frame por valores de jaccard
df_graph_tr = arrange(df_graph, desc(jaccard))
head(df_graph_tr)## from to jaccard weights
## 1 Brown.Creeper Brown.Creeper 1 0.02148438
## 2 Pacific.Wren Pacific.Wren 1 0.12695312
## 3 Pacific.slope.Flycatcher Pacific.slope.Flycatcher 1 0.07421875
## 4 Red.breasted.Nuthatch Red.breasted.Nuthatch 1 0.01367188
## 5 Dark.eyed.Junco Dark.eyed.Junco 1 0.03125000
## 6 Olive.sided.Flycatcher Olive.sided.Flycatcher 1 0.02343750
Fazendo uma cópia do data frame
df_graph_2 = df_graph_trRemovendo self-loops
Neste contexto estou retirando apenas os pares de rótulos consigo mesmos, isto é, rótulo 1 com rótulo 1, rótulo 2 com rótulo 2, assim por diante. Como esses pares de rótulos geram arestas para si mesmos e não conectam com outros, então eles não são muito úteis na criação do grafo, não agregando informação relevante. O meu interesse está nas relações entre um rótulo e os outros e não com ele mesmo.
df_graph_tr = df_graph_tr[c(-1:-19),]
head(df_graph_tr)## from to jaccard weights
## 20 Varied.Thrush Golden.Crowned.Kinglet 0.1791045 0.4000000
## 21 Golden.Crowned.Kinglet Varied.Thrush 0.1791045 0.2448980
## 22 Pacific.Wren Hammond.s.Flycatcher 0.1733333 0.5652174
## 23 Hammond.s.Flycatcher Pacific.Wren 0.1733333 0.2000000
## 24 Varied.Thrush Swainson.s.Thrush 0.1578947 0.2168675
## 25 Swainson.s.Thrush Varied.Thrush 0.1578947 0.3673469
Removendo todos os valores de similaridades de jaccard iguais a zero e menores que 0.01
df_graph_tr = df_graph_tr[!(df_graph_tr$jaccard == 0 | df_graph_tr$jaccard < 0.01),]
head(df_graph_tr)## from to jaccard weights
## 20 Varied.Thrush Golden.Crowned.Kinglet 0.1791045 0.4000000
## 21 Golden.Crowned.Kinglet Varied.Thrush 0.1791045 0.2448980
## 22 Pacific.Wren Hammond.s.Flycatcher 0.1733333 0.5652174
## 23 Hammond.s.Flycatcher Pacific.Wren 0.1733333 0.2000000
## 24 Varied.Thrush Swainson.s.Thrush 0.1578947 0.2168675
## 25 Swainson.s.Thrush Varied.Thrush 0.1578947 0.3673469
A esparsificação por KNN modifica a importância da aresta. Para cada vértice serão considerados apenas os k maiores pesos. Os pares de vértices correspondentes ficarão intactos, enquanto o restante terá o seu valor alterado para zero. Esta é uma forma simples de escolher os k maiores valores para uma aresta, mas você pode pensar em algo mais elaborado.
Reordenando o data frame pela coluna “from”
df_graph_2 = arrange(df_graph_2, desc(from))
head(df_graph_2)## from to jaccard weights
## 1 Western.Tanager Western.Tanager 1.00000000 0.05273438
## 2 Western.Tanager Olive.sided.Flycatcher 0.11428571 0.33333333
## 3 Western.Tanager Hammond.s.Flycatcher 0.11111111 0.21739130
## 4 Western.Tanager Pacific.Wren 0.10843373 0.13846154
## 5 Western.Tanager Hermit.Thrush 0.08196721 0.12820513
## 6 Western.Tanager Chestnut.backed.Chickadee 0.07272727 0.12500000
As arestas com os k maiores pesos mantém o valor de similaridade original. Nas arestas retantes, a similaridade passa a ser zero.
Como são 19 rótulos, precisamos fazer um FOR para poder preencher todo o dataframe corretamente, já que 19 X 19 = 361 pares de rótulos. Precisamos verificar para cada rótulo quais são os outros rótulos com maior peso. Então, primeiro separamos o rótulo que desejamos avaliar. Para facilitar o código, eu ordenei o data frame do maior para o menor peso. Depois basta substituir o valor de jaccard por zero a partir da linha 5 - já que queremos apenas os 4 maiores pesos.
df_graph_knn = data.frame()
i = 1
for(i in 1:19){
# filtra pelo rótulo específico
res1 = df_graph_2[df_graph_2$from == toString(names_labes$Labels[i]),]
# ordena os pesos do maior para o menor
knn = res1[order(res1$weights, decreasing=TRUE), ]
# faz jaccard = 0 a partir da linha 5
knn[5:19,]$jaccard = 0
# monta o data frame
df_graph_knn = rbind(df_graph_knn, knn)
gc()
}
head(df_graph_knn)## from to jaccard weights
## 325 Brown.Creeper Chestnut.backed.Chickadee 0.07500000 0.09375000
## 328 Brown.Creeper Olive.sided.Flycatcher 0.04545455 0.08333333
## 326 Brown.Creeper Hermit.Warbler 0.05882353 0.06976744
## 327 Brown.Creeper Varied.Thrush 0.05263158 0.06122449
## 329 Brown.Creeper Pacific.slope.Flycatcher 0.00000000 0.05263158
## 330 Brown.Creeper Golden.Crowned.Kinglet 0.00000000 0.03333333
Depois disso você também verificar os self-loops e retirá-los, como fizemos no threshold. Neste tutorial não farei isto pois quer ilustrar as diferenças nos grafos quando tratamos ou não esta questão.
Para construir o grafo usamos a função graph_from_data_frame
jaccard_graph_tr = graph_from_data_frame(df_graph_tr, directed=F)
jaccard_graph_tr## IGRAPH 27edf4a UN-- 19 184 --
## + attr: name (v/c), jaccard (e/n), weights (e/n)
## + edges from 27edf4a (vertex names):
## [1] Varied.Thrush --Golden.Crowned.Kinglet
## [2] Varied.Thrush --Golden.Crowned.Kinglet
## [3] Pacific.Wren --Hammond.s.Flycatcher
## [4] Pacific.Wren --Hammond.s.Flycatcher
## [5] Varied.Thrush --Swainson.s.Thrush
## [6] Varied.Thrush --Swainson.s.Thrush
## [7] Golden.Crowned.Kinglet--Black.headed.Grosbeak
## [8] Golden.Crowned.Kinglet--Black.headed.Grosbeak
## + ... omitted several edges
V(jaccard_graph_tr) # retorna os vértices## + 19/19 vertices, named, from 27edf4a:
## [1] Varied.Thrush Golden.Crowned.Kinglet
## [3] Pacific.Wren Hammond.s.Flycatcher
## [5] Swainson.s.Thrush Black.headed.Grosbeak
## [7] Pacific.slope.Flycatcher Hermit.Thrush
## [9] Dark.eyed.Junco Olive.sided.Flycatcher
## [11] Western.Tanager Chestnut.backed.Chickadee
## [13] MacGillivray.s.Warbler Warbling.Vireo
## [15] Brown.Creeper Hermit.Warbler
## [17] Common.Nighthawk Red.breasted.Nuthatch
## [19] Stellar.s.Jay
E(jaccard_graph_tr) # retorna as arestas## + 184/184 edges from 27edf4a (vertex names):
## [1] Varied.Thrush --Golden.Crowned.Kinglet
## [2] Varied.Thrush --Golden.Crowned.Kinglet
## [3] Pacific.Wren --Hammond.s.Flycatcher
## [4] Pacific.Wren --Hammond.s.Flycatcher
## [5] Varied.Thrush --Swainson.s.Thrush
## [6] Varied.Thrush --Swainson.s.Thrush
## [7] Golden.Crowned.Kinglet--Black.headed.Grosbeak
## [8] Golden.Crowned.Kinglet--Black.headed.Grosbeak
## [9] Varied.Thrush --Pacific.slope.Flycatcher
## [10] Varied.Thrush --Pacific.slope.Flycatcher
## + ... omitted several edges
jaccard_graph_knn = graph_from_data_frame(df_graph_knn, directed=F)
jaccard_graph_knn## IGRAPH dcd6bb5 UN-- 19 361 --
## + attr: name (v/c), jaccard (e/n), weights (e/n)
## + edges from dcd6bb5 (vertex names):
## [1] Brown.Creeper--Chestnut.backed.Chickadee
## [2] Brown.Creeper--Olive.sided.Flycatcher
## [3] Brown.Creeper--Hermit.Warbler
## [4] Brown.Creeper--Varied.Thrush
## [5] Brown.Creeper--Pacific.slope.Flycatcher
## [6] Brown.Creeper--Golden.Crowned.Kinglet
## [7] Brown.Creeper--Brown.Creeper
## [8] Brown.Creeper--Pacific.Wren
## + ... omitted several edges
V(jaccard_graph_knn)## + 19/19 vertices, named, from dcd6bb5:
## [1] Brown.Creeper Pacific.Wren
## [3] Pacific.slope.Flycatcher Red.breasted.Nuthatch
## [5] Dark.eyed.Junco Olive.sided.Flycatcher
## [7] Hermit.Thrush Chestnut.backed.Chickadee
## [9] Varied.Thrush Hermit.Warbler
## [11] Swainson.s.Thrush Hammond.s.Flycatcher
## [13] Western.Tanager Black.headed.Grosbeak
## [15] Golden.Crowned.Kinglet Warbling.Vireo
## [17] MacGillivray.s.Warbler Stellar.s.Jay
## [19] Common.Nighthawk
E(jaccard_graph_knn)## + 361/361 edges from dcd6bb5 (vertex names):
## [1] Brown.Creeper--Chestnut.backed.Chickadee
## [2] Brown.Creeper--Olive.sided.Flycatcher
## [3] Brown.Creeper--Hermit.Warbler
## [4] Brown.Creeper--Varied.Thrush
## [5] Brown.Creeper--Pacific.slope.Flycatcher
## [6] Brown.Creeper--Golden.Crowned.Kinglet
## [7] Brown.Creeper--Brown.Creeper
## [8] Brown.Creeper--Pacific.Wren
## [9] Brown.Creeper--Red.breasted.Nuthatch
## [10] Brown.Creeper--Dark.eyed.Junco
## + ... omitted several edges
par(mfrow=c(1,1))
plot(jaccard_graph_tr)
title(cex.main= 0.8, main = "Treshold Graph")par(mfrow=c(1,1))
plot(jaccard_graph_knn)
title(cex.main= 0.8, main = "Knn Graph")A modularidade mede a qualidade da partição ou quão separados estão os diferentes tipos de vértices uns dos outros. Portanto, quantifica a densidade de links dentro das comunidades comparado com links entre comunidades. Dentro de um grupo, os nós são altamente conectados em comparação com os outros grupos. Quanto maior o valor da modularidade melhor!
\[ Q = \sum_{x}(e_{xy} - a^2) \]
\[ a_{y} = \sum_{y} e_{xy} \]
e_{xy} é a quantidade de links de um grafo que conecta os nós em uma comunidade x para os nós de uma comunidade y.
A grosso modo, uma comunidade é um conjunto de vértices com muitas arestas dentro da comunidade e poucas arestas fora da comunidade.
Os grafos associados são em geral globalmente esparsos, mas localmente densos: existem grupos de vértices, chamados de comunidades, altamente conectados entre si, mas com poucos links para outros vértices.
Métodos de detecção de comunidade são basicamente problemas de particionamento de grafos: consiste em dividir os vértices em grupos de tal forma que o número de arestas entre eles é minimizado.
Uma boa divisão da rede em comunidades não é simplesmente uma em que o número de arestas entre os grupos é pequeno, mas uma em que o número de arestas entre os grupos é menor do que o esperado.
Edge Betweenness significa aresta intermediária. É um método de detecção de estrutura de comunidade baseada em arestas intermediárias. Muitas redes consistem em módulos (grupos/comunidades) densamente conectados, mas escassamente conectados a outros módulos
Edge Beteweenness mede o número de caminhos mais curtos através da aresta. O método usa técnicas de Algoritmos de Agrupamento Hierárquicos Divisivos: descobrir divisões naturais baseadas em métodos de similaridades ou força de conexão entre os vértices.
Passo a passo do algoritmo (simplificado)
Calcular o score edge betweenness para todas as arestas da rede
Encontrar a aresta com o maior score e removê-la da rede
Recalcular o score edge betwenness para as arestas que ficaram
Repetir a partir do passo 2
Ideia do Algoritmo
É provável que as arestas que conectam módulos separados tenham alta intermediação de arestas, já que todos os caminhos mais curtos de um módulo a outro devem passar por elas. Portanto, se removermos gradualmente a aresta com a pontuação de intermediação mais alta, obteremos um dendrograma. As folhas da árvore são os vértices individuais e a raiz da árvore representa o gráfico inteiro.
De acordo com o artigo original:
“[…] Primeiro, usamos uma técnica de “divisão” que remove de forma iterativa as arestas da rede, dividindo-a assim em comunidades. As arestas a serem removidas são identificadas usando uma medida de um conjunto de medidas de intermediação de arestas, das quais a mais simples é uma generalização para as arestas da intermediação de caminho mais curto padrão de Freeman. Em segundo lugar, nossos algoritmos incluem uma etapa de recálculo em que as pontuações de intermediação são reavaliadas após a remoção de cada aresta. Esta etapa, que estava faltando nos algoritmos anteriores, é de fundamental importância para o sucesso dos algortimos. Sem ele, os algoritmos falham miseravelmente até mesmo nas tarefas de clustering mais simples.”
Parâmetros da Função cluster_edge_betweeness
GRAPH: grafo construído
WEIGTHS: pesos das arestas. NULL pode ser usado para omitir os pesos das arestas. Os pesos são usados por padrão se estiverem presentes. Pesos de aresta são usados para calcular as arestas intermediárias ponderadas. Isso significa que as arestas são interpretadas como distâncias, não como pontos fortes de conexão.
MERGES: indica se deve ser retornando os pontos de fusão calculados pelo algoritmo em forma de matriz
BRIDGES: indica se deve retornar as arestas removidas que foram capazes de dividir a rede
MODULARITY: indica se deve ser calculada a pontuação máxima de modularidade, considerando todas as estruturas de comunidades possíveis ao longo do edge betweenness baseado nas aretas removidas.
MEMBERSHIP: indica se deve ser calculado o vetor de membership correspondente à pontuação de modularidade mais alta possível.
Aplicando o método
eb_tr = cluster_edge_betweenness(jaccard_graph_tr,
weights = jaccard_graph_tr$weights,
edge.betweenness = TRUE,
merges = TRUE,
bridges = TRUE,
modularity = TRUE,
membership = TRUE)
eb_knn = cluster_edge_betweenness(jaccard_graph_knn,
weights = jaccard_graph_tr$weights,
edge.betweenness = TRUE,
merges = TRUE,
bridges = TRUE,
modularity = TRUE,
membership = TRUE)Função para plotar os grafos
plotar <- function(comunidade, grafo, titulo){
plot(comunidade, grafo,
vertex.size=18,
vertex.color="gold",
vertex.shape = "sphere",
vertex.frame.color="orange",
vertex.label.color="black",
vertex.label.cex=0.7,
vertex.label.family = "Times",
vertex.label.font =0.5,
edge.arrow.size=.5,
edge.color = "gray",
edge.width = 0.5)
title(cex.main= 0.8, main = titulo)
}Plotando os Grafos
As cores circulando alguns nós individuais, ou grupos de nós, representam as comunidades.
par(mfrow=c(1,2))
plotar(eb_tr, jaccard_graph_tr, "Edge Betweenness threshold")
plotar(eb_knn, jaccard_graph_knn, "Edge Betweenness knn")Informações dos grafos
eb_tr## IGRAPH clustering edge betweenness, groups: 6, mod: 0.00089
## + groups:
## $`1`
## [1] "Varied.Thrush" "Golden.Crowned.Kinglet"
## [3] "Pacific.Wren" "Hammond.s.Flycatcher"
## [5] "Swainson.s.Thrush" "Pacific.slope.Flycatcher"
## [7] "Hermit.Thrush" "Dark.eyed.Junco"
## [9] "Olive.sided.Flycatcher" "Western.Tanager"
## [11] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [13] "Brown.Creeper" "Hermit.Warbler"
##
## $`2`
## + ... omitted several groups/vertices
eb_knn## IGRAPH clustering edge betweenness, groups: 6, mod: 1.1e-16
## + groups:
## $`1`
## [1] "Brown.Creeper"
##
## $`2`
## [1] "Pacific.Wren"
##
## $`3`
## [1] "Pacific.slope.Flycatcher"
##
## $`4`
## + ... omitted several groups/vertices
Tamanho de cada comunidade
sizes(eb_tr)## Community sizes
## 1 2 3 4 5 6
## 14 1 1 1 1 1
sizes(eb_knn)## Community sizes
## 1 2 3 4 5 6
## 1 1 1 1 1 14
Listando as comunidades
communities(eb_tr)## $`1`
## [1] "Varied.Thrush" "Golden.Crowned.Kinglet"
## [3] "Pacific.Wren" "Hammond.s.Flycatcher"
## [5] "Swainson.s.Thrush" "Pacific.slope.Flycatcher"
## [7] "Hermit.Thrush" "Dark.eyed.Junco"
## [9] "Olive.sided.Flycatcher" "Western.Tanager"
## [11] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [13] "Brown.Creeper" "Hermit.Warbler"
##
## $`2`
## [1] "Black.headed.Grosbeak"
##
## $`3`
## [1] "MacGillivray.s.Warbler"
##
## $`4`
## [1] "Common.Nighthawk"
##
## $`5`
## [1] "Red.breasted.Nuthatch"
##
## $`6`
## [1] "Stellar.s.Jay"
communities(eb_knn) ## $`1`
## [1] "Brown.Creeper"
##
## $`2`
## [1] "Pacific.Wren"
##
## $`3`
## [1] "Pacific.slope.Flycatcher"
##
## $`4`
## [1] "Red.breasted.Nuthatch"
##
## $`5`
## [1] "Dark.eyed.Junco"
##
## $`6`
## [1] "Olive.sided.Flycatcher" "Hermit.Thrush"
## [3] "Chestnut.backed.Chickadee" "Varied.Thrush"
## [5] "Hermit.Warbler" "Swainson.s.Thrush"
## [7] "Hammond.s.Flycatcher" "Western.Tanager"
## [9] "Black.headed.Grosbeak" "Golden.Crowned.Kinglet"
## [11] "Warbling.Vireo" "MacGillivray.s.Warbler"
## [13] "Stellar.s.Jay" "Common.Nighthawk"
Grupos
eb_tr$membership## [1] 1 1 1 1 1 2 1 1 1 1 1 1 3 1 1 1 4 5 6
eb_knn$membership ## [1] 1 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6
membership(eb_tr)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 1 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 1 1 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 1 1
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 1 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 3 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 1 4 5
## Stellar.s.Jay
## 6
membership(eb_knn)## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 2 3
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher
## 4 5 6
## Hermit.Thrush Chestnut.backed.Chickadee Varied.Thrush
## 6 6 6
## Hermit.Warbler Swainson.s.Thrush Hammond.s.Flycatcher
## 6 6 6
## Western.Tanager Black.headed.Grosbeak Golden.Crowned.Kinglet
## 6 6 6
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 6 6 6
## Common.Nighthawk
## 6
Arestas removidas
head(eb_tr$removed.edges)## [1] 145 146 97 98 85 86
head(eb_knn$removed.edges)## [1] 1 135 3 174 2 99
Arestas removidas que realmente dividiram um componente do grafo
eb_tr$bridges## [1] 185 183 179 173 165 155 143 131 117 101 85 69 57 45 33 23 13 5
eb_knn$bridges## [1] 343 341 337 331 323 313 301 287 271 253 233 211 187 161 133 103 71 37
Valores do cálculo de edge betweenness
head(eb_tr$edge.betweenness)## [1] 5.838095 9.914719 9.000000 18.000000 3.134804 4.928571
head(eb_knn$edge.betweenness)## [1] 0.5000000 1.0000000 0.5294118 1.0303030 0.5625000 1.0645161
Pontos de mesclagem do algoritmo divisivo
head(eb_tr$merges)## [,1] [,2]
## [1,] 16 11
## [2,] 20 9
## [3,] 21 2
## [4,] 12 22
## [5,] 23 5
## [6,] 24 1
head(eb_knn$merges)## [,1] [,2]
## [1,] 19 18
## [2,] 20 17
## [3,] 21 16
## [4,] 22 15
## [5,] 23 14
## [6,] 24 13
Total de vértices do grafo
eb_tr$vcount## [1] 19
eb_knn$vcount ## [1] 19
Valor de modularidade da estrutura da comunidade
eb_tr$modularity## [1] -6.149575e-02 -6.037335e-02 -5.399338e-02 -4.903119e-02 -5.186673e-02
## [6] -5.511578e-02 -5.606096e-02 -6.303166e-02 -5.647448e-02 -2.528355e-02
## [11] -2.020321e-02 -1.417769e-02 -1.063327e-03 8.861059e-04 -5.907372e-05
## [16] -4.903119e-03 -1.654064e-03 -2.362949e-04 0.000000e+00
modularity(eb_tr)## [1] 0.0008861059
head(modularity_matrix(jaccard_graph_tr))## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] -2.13043478 0.02173913 0.3260870 0.7826087 -0.2826087 -0.9130435
## [2,] 0.02173913 -1.83695652 0.4456522 -1.1304348 -0.1195652 1.1521739
## [3,] 0.32608696 0.44565217 -1.3152174 1.0434783 0.2065217 -0.7173913
## [4,] 0.78260870 -1.13043478 1.0434783 -0.6956522 0.6956522 -0.5217391
## [5,] -0.28260870 -0.11956522 0.2065217 0.6956522 -2.4456522 1.0217391
## [6,] -0.91304348 1.15217391 -0.7173913 -0.5217391 1.0217391 -0.3913043
## [,7] [,8] [,9] [,10] [,11] [,12]
## [1,] 0.02173913 0.3260870 0.4782609 0.4782609 0.3260870 -0.43478261
## [2,] 0.16304348 0.4456522 0.5869565 -1.4130435 0.4456522 -0.26086957
## [3,] 0.44565217 -1.3152174 -1.1956522 0.8043478 0.6847826 0.08695652
## [4,] 0.86956522 -0.9565217 1.1304348 -0.8695652 1.0434783 0.60869565
## [5,] -0.11956522 0.2065217 0.3695652 0.3695652 0.2065217 -0.60869565
## [6,] -0.84782609 1.2826087 -0.6521739 -0.6521739 -0.7173913 -1.04347826
## [,13] [,14] [,15] [,16] [,17] [,18]
## [1,] -0.7608696 0.9347826 1.0869565 -0.2826087 -1.0652174 1.3913043
## [2,] 1.2934783 1.0108696 1.1521739 -0.1195652 -0.9891304 -0.5652174
## [3,] -0.5978261 -0.8369565 -0.7173913 0.2065217 1.1630435 -0.4782609
## [4,] -0.4347826 -0.6086957 -0.5217391 0.6956522 -0.6086957 -0.3478261
## [5,] 1.1847826 0.8586957 -0.9782609 -0.4456522 0.8586957 -0.6521739
## [6,] 1.6739130 -0.4565217 -0.3913043 1.0217391 1.5434783 -0.2608696
## [,19]
## [1,] -0.3043478
## [2,] -0.2826087
## [3,] 1.7608696
## [4,] -0.1739130
## [5,] -0.3260870
## [6,] -0.1304348
eb_knn$modularity## [1] 8.239937e-18 8.673617e-18 1.040834e-17 1.387779e-17 1.387779e-17
## [6] 1.387779e-17 2.775558e-17 2.775558e-17 2.775558e-17 5.551115e-17
## [11] 0.000000e+00 5.551115e-17 0.000000e+00 1.110223e-16 0.000000e+00
## [16] 1.110223e-16 0.000000e+00 1.110223e-16 0.000000e+00
modularity(eb_knn)## [1] 1.110223e-16
head(modularity_matrix(jaccard_graph_knn))## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [4,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [6,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [,15] [,16] [,17] [,18] [,19]
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
## [3,] 0 0 0 0 0
## [4,] 0 0 0 0 0
## [5,] 0 0 0 0 0
## [6,] 0 0 0 0 0
Compara duas comunidades
Avalia a distância entre duas estruturas da comunidade
compare(eb_tr, eb_knn)## [1] 1.807556
compare(membership(eb_tr), membership(eb_knn))## [1] 1.807556
Verificando se é Hierárquico
is_hierarchical(eb_tr)## [1] TRUE
dend_eb = as.dendrogram(eb_tr)
dend_eb ## 'dendrogram' with 2 branches and 19 members total, at height 18
hc_eb = as.hclust(eb_tr)
hc_eb ##
## Call:
## as.hclust.dendrogram(x = as.dendrogram(x, hang = hang, use.modularity = use.modularity))
##
## Cluster method : NA
## Distance : NA
## Number of objects: 19
hc_eb$order## [1] 19 18 13 17 14 15 10 8 12 16 11 9 2 5 1 7 3 4 6
is_hierarchical(eb_knn)## [1] TRUE
dend_eb_knn = as.dendrogram(eb_knn)
dend_eb_knn## 'dendrogram' with 2 branches and 19 members total, at height 18
hc_eb_knn = as.hclust(eb_knn)
hc_eb_knn##
## Call:
## as.hclust.dendrogram(x = as.dendrogram(x, hang = hang, use.modularity = use.modularity))
##
## Cluster method : NA
## Distance : NA
## Number of objects: 19
hc_eb_knn$order## [1] 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Plotando os Dendrogramas
par(mfrow=c(1,1))
plot_dendrogram(eb_tr)
title(cex.main= 0.8, main = "Dendrogram threshold")par(mfrow=c(1,1))
plot_dendrogram(eb_knn)
title(cex.main= 0.8, main = "Dendrogram knn")Do artigo: “[…] em nosso algoritmo, cada nó é inicializado com um rótulo único e, a cada passo, cada nó adota o rótulo que a maioria de seus vizinhos possui. Neste processo iterativo, grupos de nós densamente conectados formam um consenso sobre um rótulo único para formar comunidades […]”
Este algoritmo simula a difusão do fluxo na rede através da difusão de rótulos. No grafo, cada vértice é associado a uma único rótulo. Depois o rótulo de cada vértice é atualizado iterativamente com o rótulo majoritário associado aos vizinhos, sendo a atualização aleatória. O algoritmo pára quando todos os rótulos dos vértices são consistentes com o rótulo mais frequente na vizinhança.
Passo a Passo do Método
Inicialize os rótulos em todos os nós da rede. Para um determinado nó x, C x (0) = x;
Defina t = 1;
Organize os nós da rede em uma ordem aleatória e defina-a como X;
Para cada x ∈ X escolhido nessa ordem específica, seja C x (t) = f (C x i1 (t), …, C x im (t), C xi (m + 1) (t - 1), …, C x ik (t - 1)). f retorna o rótulo que ocorre com a frequência mais alta entre os vizinhos e os laços são quebrados de maneira uniforme e aleatória;
Se cada nó tiver um rótulo que indica o número máximo de seus vizinhos, pare o algoritmo. Caso contrário, defina t = t + 1 e vá para (3).
Parâmetros do Método
GRAPH: grafo. Deve ser não direcionado para fazer sentido.
WEIGTHS: pesos positivos. É um parametro opcional. Se o grafo tem um atribo de pesos de arestas, então eles são usados por padrão. Pesos de arestas maiores correspondem a conexões mais fortes.
INITIAL: é o estado inicial. Se for NULL, cada vértice terá um rótulo diferente no início. Caso contrário, deve ser um vetor com uma entrada para cada vértice. Valores não negativos denotam rótulos diferentes, entradas negativas denotam vértices sem rótulos.
FIXED: é um vetor lógico que denota quais rótulos são fixos. Este parâmetro deve ser usado quando um valor inicial é definido, caso contrário será ignorado. Observe também que vértices sem rótulos não podem ser fixed.
Aplicando o método
lp_tr = cluster_label_prop(jaccard_graph_tr,
weights = jaccard_graph_tr$weights)
lp_knn = cluster_label_prop(jaccard_graph_knn,
weights = jaccard_graph_knn$weights)Plotando os grafos
par(mfrow=c(1,2))
plotar(lp_tr, jaccard_graph_tr, "Label Propagation threshold")
plotar(lp_knn, jaccard_graph_knn, "Label Propagation knn")Informações
lp_tr## IGRAPH clustering label propagation, groups: 1, mod: 0
## + groups:
## $`1`
## [1] "Varied.Thrush" "Golden.Crowned.Kinglet"
## [3] "Pacific.Wren" "Hammond.s.Flycatcher"
## [5] "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [7] "Pacific.slope.Flycatcher" "Hermit.Thrush"
## [9] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [11] "Western.Tanager" "Chestnut.backed.Chickadee"
## [13] "MacGillivray.s.Warbler" "Warbling.Vireo"
## [15] "Brown.Creeper" "Hermit.Warbler"
## [17] "Common.Nighthawk" "Red.breasted.Nuthatch"
## + ... omitted several groups/vertices
lp_knn## IGRAPH clustering label propagation, groups: 1, mod: 0
## + groups:
## $`1`
## [1] "Brown.Creeper" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Red.breasted.Nuthatch"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Hermit.Thrush" "Chestnut.backed.Chickadee"
## [9] "Varied.Thrush" "Hermit.Warbler"
## [11] "Swainson.s.Thrush" "Hammond.s.Flycatcher"
## [13] "Western.Tanager" "Black.headed.Grosbeak"
## [15] "Golden.Crowned.Kinglet" "Warbling.Vireo"
## [17] "MacGillivray.s.Warbler" "Stellar.s.Jay"
## + ... omitted several groups/vertices
Membership
membership(lp_tr)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 1 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 1 1 1
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 1 1
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 1 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 1 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 1 1 1
## Stellar.s.Jay
## 1
membership(lp_knn)## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 1 1
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher
## 1 1 1
## Hermit.Thrush Chestnut.backed.Chickadee Varied.Thrush
## 1 1 1
## Hermit.Warbler Swainson.s.Thrush Hammond.s.Flycatcher
## 1 1 1
## Western.Tanager Black.headed.Grosbeak Golden.Crowned.Kinglet
## 1 1 1
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 1 1 1
## Common.Nighthawk
## 1
Tamanho
sizes(lp_tr)## Community sizes
## 1
## 19
sizes(lp_knn)## Community sizes
## 1
## 19
Modularidade
# ambos grafos não possuem estrutura de comunidade
modularity(lp_tr)## [1] 0
modularity(lp_knn)## [1] 0
Comunidades
communities(lp_tr)## $`1`
## [1] "Varied.Thrush" "Golden.Crowned.Kinglet"
## [3] "Pacific.Wren" "Hammond.s.Flycatcher"
## [5] "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [7] "Pacific.slope.Flycatcher" "Hermit.Thrush"
## [9] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [11] "Western.Tanager" "Chestnut.backed.Chickadee"
## [13] "MacGillivray.s.Warbler" "Warbling.Vireo"
## [15] "Brown.Creeper" "Hermit.Warbler"
## [17] "Common.Nighthawk" "Red.breasted.Nuthatch"
## [19] "Stellar.s.Jay"
communities(lp_knn)## $`1`
## [1] "Brown.Creeper" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Red.breasted.Nuthatch"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Hermit.Thrush" "Chestnut.backed.Chickadee"
## [9] "Varied.Thrush" "Hermit.Warbler"
## [11] "Swainson.s.Thrush" "Hammond.s.Flycatcher"
## [13] "Western.Tanager" "Black.headed.Grosbeak"
## [15] "Golden.Crowned.Kinglet" "Warbling.Vireo"
## [17] "MacGillivray.s.Warbler" "Stellar.s.Jay"
## [19] "Common.Nighthawk"
É hierárquico?
is_hierarchical(lp_tr)## [1] FALSE
is_hierarchical(lp_knn)## [1] FALSE
O algoritmo é baseado em random walks, isto é, numa caminhada aleatória ou passeio aleatório, o qual consiste de uma sucessão de passos aleatórios. Mais informações, por favor, acesse: https://pt.wikipedia.org/wiki/Passeio_aleat%C3%B3rio.
No contexto de grafos, o processo do random walk indica que em cada passo o caminhante está em um vértice e aleatoriamente se move para outro vértice vizinho.
De acordo com os autores do artigo original, passeios aleatórios tendem a ficar presos em partes densamente conectadas do grafo, dai o nome walktrap. Portanto, caminhos aleatórios de curta distância tendem a permanecer na mesma comunidade.
O algoritmo é baseado em algoritmos de agrupamento aglomerativo hierárquico. De acordo com o artigo original, o objetivo foi criar uma nova medida de distância entre vértices que quantificam sua estrutura de similaridade usando random walks a qual pode ser usada no algoritmo de agrupamento hierarquico aglomerativo.
Passo a passo do algoritmo:
Começa com uma partição não agrupada, isto é, uma partição com n comunidades.
Calcula todas as distâncias entre todos os vértices adjacentes
A partição evolui repetindo as operações a seguir em cada passo:
Escolher 2 comunidades de acordo com o critério baseado na distância entre as comunidades
Fundir as 2 comunidades em uma nova e criar uma nova partição
Atualizar as distâncias entre as comunidades
Parametros
GRAPH: grafo propriamente dito
WEIGHTS: pesos das arestas. Pesos de aresta maiores aumentam a probabilidade de que uma aresta seja selecionada pelo random walk, portanto, pesos de aresta maiores correspondem a conexões mais fortes.
STEPS: é o comprimento das caminhadas aleatórias a serem realizadas. Importante: De acordo com o artigo original este é um item aberto de pesquisa pois ainda é dificil dizer qual o número ideal de passos. No entanto, eles recomendam usar de 3 a 8 passos, mas que 4 ou 5 passos parecem ser os melhores.
MERGES: se deseja incluir a matriz de mesclagem no resultado.
MODULARITY: se deve ser incluido o vetor das pontuações de modularidade no resultado. Se o argumento da associação for verdadeiro, ele sempre será calculado.
MEMBERSHIP: se deve ser calculado o vetor de membership para a divisão correspondente ao maior valor de modularidade.
Aplicando o método
wt_tr = cluster_walktrap(jaccard_graph_tr,
weights = jaccard_graph_tr$weights,
steps = 3,
merges = TRUE,
modularity = TRUE,
membership = TRUE)
wt_knn = cluster_walktrap(jaccard_graph_knn,
weights = jaccard_graph_knn$weights,
steps = 3,
merges = TRUE,
modularity = TRUE,
membership = TRUE)Plot
par(mfrow=c(1,2))
plotar(wt_tr, jaccard_graph_tr, "Walktrap threshold")
plotar(wt_knn, jaccard_graph_knn, "Walktrap knn")Informações
wt_tr## IGRAPH clustering walktrap, groups: 3, mod: 0.083
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [9] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## + ... omitted several groups/vertices
wt_knn## IGRAPH clustering walktrap, groups: 1, mod: 0.05
## + groups:
## $`1`
## [1] "Brown.Creeper" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Red.breasted.Nuthatch"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Hermit.Thrush" "Chestnut.backed.Chickadee"
## [9] "Varied.Thrush" "Hermit.Warbler"
## [11] "Swainson.s.Thrush" "Hammond.s.Flycatcher"
## [13] "Western.Tanager" "Black.headed.Grosbeak"
## [15] "Golden.Crowned.Kinglet" "Warbling.Vireo"
## [17] "MacGillivray.s.Warbler" "Stellar.s.Jay"
## + ... omitted several groups/vertices
Membership
membership(wt_tr)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 1 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 1
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 2 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 3
membership(wt_knn)## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 1 1
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher
## 1 1 1
## Hermit.Thrush Chestnut.backed.Chickadee Varied.Thrush
## 1 1 1
## Hermit.Warbler Swainson.s.Thrush Hammond.s.Flycatcher
## 1 1 1
## Western.Tanager Black.headed.Grosbeak Golden.Crowned.Kinglet
## 1 1 1
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 1 1 1
## Common.Nighthawk
## 1
Tamanho
sizes(wt_tr)## Community sizes
## 1 2 3
## 10 8 1
sizes(wt_knn)## Community sizes
## 1
## 19
Modularidade
# tem modularidade maior que o knn
modularity(wt_tr)## [1] 0.08299859
modularity(wt_knn)## [1] 0.04986149
Comunidades
communities(wt_tr)## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [9] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
##
## $`3`
## [1] "Stellar.s.Jay"
communities(wt_knn)## $`1`
## [1] "Brown.Creeper" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Red.breasted.Nuthatch"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Hermit.Thrush" "Chestnut.backed.Chickadee"
## [9] "Varied.Thrush" "Hermit.Warbler"
## [11] "Swainson.s.Thrush" "Hammond.s.Flycatcher"
## [13] "Western.Tanager" "Black.headed.Grosbeak"
## [15] "Golden.Crowned.Kinglet" "Warbling.Vireo"
## [17] "MacGillivray.s.Warbler" "Stellar.s.Jay"
## [19] "Common.Nighthawk"
É hierárquico?
is_hierarchical(wt_tr)## [1] TRUE
is_hierarchical(wt_knn)## [1] TRUE
Plot TR
dend_wt = as.dendrogram(wt_tr)
hc_wt = as.hclust(wt_tr)
hc_wt$order## [1] 19 6 13 17 2 8 11 5 16 14 18 3 15 4 9 10 12 1 7
par(mfrow=c(1,1))
plot_dendrogram(wt_tr)
title(cex.main= 0.8, main = "Dendrogram Walktrap Threshold")Plot KNN
dend_wt = as.dendrogram(wt_knn)
hc_wt = as.hclust(wt_knn)
hc_wt$order## [1] 8 14 5 15 9 17 3 2 4 11 1 7 19 10 12 13 6 16 18
par(mfrow=c(1,1))
plot_dendrogram(wt_knn)
title(cex.main= 0.8, main = "Dendrogram Walktrap Knn")O método baseado na teoria spectral, o qual constrói uma matriz laplaciana e encontra os autovalores e autovetores. Com base nos valores dos autovalores ele faz as divisões em comunidades. Entretanto, existe um truque no algoritmo que é trocar a matriz laplaciana pela matriz da modularidade e só então obter os autovalores e autovetores.
No spectral clustering existem duas opções:
Se exitem tem duas comunidades, é só colocar os vértices cujos autovalores são positivos em uma comunidade e os vértices cujos autovalores são negativos em outra comunidade
Se existir k comunidades, você roda um kmeans na matriz de autovetores
Portanto, o grafo é dividido em dois de forma que a modularidade é maximizada baseada no autovetor principal. Calcula-se a contribuição da modularidade em casa passo da subdivisão da rede e o algoritmo pára quando o valor da contribuição da mondularidade é não positivo.
De acordo com os autores originais do método, este pode ser considerado um PCA (principal componente analysis) para redes.
Parâmetros
GRAPH: grafo propriamente dito.
STEPS: é o número de tentativas de uma etapa a serem executadas. Não tem utilidade.
WEIGTHS: pesos
START: é um vetor de associação numérica que fornece a configuração inicial do algoritmo. Também pode ser NULL.
OPTIONS: uma lista nomeada para substituir algumas opções ARPACK.
CALLBACK: este parametro é chamado após cada iteração, após calcular o autovetor líder da matriz de modularidade.
EXTRA: parâmetro adicional a ser fornecido à função de retorno de chamada.
ENV: é o ambiente no qual a função de retorno de chamada é avaliada.
Aplicando o método
le_tr = cluster_leading_eigen(jaccard_graph_tr,
weights = jaccard_graph_tr$weights)
le_knn = cluster_leading_eigen(jaccard_graph_knn,
weights = jaccard_graph_knn$weights)Plot
par(mfrow=c(1,2))
plotar(le_tr, jaccard_graph_tr, "Leading Eigenvector threshold")
plotar(le_knn, jaccard_graph_knn, "Leading Eigenvector knn")Informações
le_tr## IGRAPH clustering leading eigenvector, groups: 2, mod: 0.093
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [9] "Brown.Creeper" "Red.breasted.Nuthatch"
## [11] "Stellar.s.Jay"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## + ... omitted several groups/vertices
le_knn## IGRAPH clustering leading eigenvector, groups: 1, mod: 0
## + groups:
## $`1`
## [1] "Brown.Creeper" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Red.breasted.Nuthatch"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Hermit.Thrush" "Chestnut.backed.Chickadee"
## [9] "Varied.Thrush" "Hermit.Warbler"
## [11] "Swainson.s.Thrush" "Hammond.s.Flycatcher"
## [13] "Western.Tanager" "Black.headed.Grosbeak"
## [15] "Golden.Crowned.Kinglet" "Warbling.Vireo"
## [17] "MacGillivray.s.Warbler" "Stellar.s.Jay"
## + ... omitted several groups/vertices
Membership
membership(le_tr)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 1 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 1
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 2 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 1
membership(le_knn) ## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 1 1
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher
## 1 1 1
## Hermit.Thrush Chestnut.backed.Chickadee Varied.Thrush
## 1 1 1
## Hermit.Warbler Swainson.s.Thrush Hammond.s.Flycatcher
## 1 1 1
## Western.Tanager Black.headed.Grosbeak Golden.Crowned.Kinglet
## 1 1 1
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 1 1 1
## Common.Nighthawk
## 1
Tamanho
sizes(le_tr)## Community sizes
## 1 2
## 11 8
sizes(le_knn)## Community sizes
## 1
## 19
Modularidade
# tem maior modularidade
modularity(le_tr)## [1] 0.09304112
# não tem estrutura de comunidade
modularity(le_knn)## [1] 0
Comunidades
communities(le_tr)## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [9] "Brown.Creeper" "Red.breasted.Nuthatch"
## [11] "Stellar.s.Jay"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
communities(le_knn)## $`1`
## [1] "Brown.Creeper" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Red.breasted.Nuthatch"
## [5] "Dark.eyed.Junco" "Olive.sided.Flycatcher"
## [7] "Hermit.Thrush" "Chestnut.backed.Chickadee"
## [9] "Varied.Thrush" "Hermit.Warbler"
## [11] "Swainson.s.Thrush" "Hammond.s.Flycatcher"
## [13] "Western.Tanager" "Black.headed.Grosbeak"
## [15] "Golden.Crowned.Kinglet" "Warbling.Vireo"
## [17] "MacGillivray.s.Warbler" "Stellar.s.Jay"
## [19] "Common.Nighthawk"
É hierárquico?
is_hierarchical(le_tr)## [1] TRUE
dend_le = as.dendrogram(le_tr)
hc_le = as.hclust(le_tr)
hc_le$order## [1] 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6
Plot
par(mfrow=c(1,1))
plot_dendrogram(le_tr)
title(cex.main= 0.8, main = "Dendrogram Leading \n Eigenvector Treshold")O objetivo do método é encontrar agrupamentos com máxima modularidade produzindo partições ótimas. O método é baseado em conceitos de algoritmo de agrupamento hierárquico: começa com um único grupo e iterativamente mescla dois grupos que tem a maior modularidade. Depois de n-1 fusões, o agrupamento que alcançar a mais alta modularidade é retornada.
Parâmetros
GRAPH: grafo
WEIGTHS: pesos
Aplicando o método
op_tr = cluster_optimal(jaccard_graph_tr,
weights = jaccard_graph_tr$weights)
op_knn = cluster_optimal(jaccard_graph_knn,
weights = jaccard_graph_knn$weights)Plotando
par(mfrow=c(1,2))
plotar(op_tr, jaccard_graph_tr, "Optimal threshold")
plotar(op_knn, jaccard_graph_knn, "Optimal Eigenvector knn")Informações
op_tr## IGRAPH clustering optimal, groups: 3, mod: 0.098
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
## + ... omitted several groups/vertices
op_knn## IGRAPH clustering optimal, groups: 19, mod: 0
## + groups:
## $`1`
## [1] "Brown.Creeper"
##
## $`2`
## [1] "Pacific.Wren"
##
## $`3`
## [1] "Pacific.slope.Flycatcher"
##
## $`4`
## + ... omitted several groups/vertices
Membership
membership(op_tr)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 1 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 3
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 2 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 3 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 3
membership(op_knn)## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 2 3
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher
## 4 5 6
## Hermit.Thrush Chestnut.backed.Chickadee Varied.Thrush
## 7 8 9
## Hermit.Warbler Swainson.s.Thrush Hammond.s.Flycatcher
## 10 11 12
## Western.Tanager Black.headed.Grosbeak Golden.Crowned.Kinglet
## 13 14 15
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 16 17 18
## Common.Nighthawk
## 19
Tamanho
sizes(op_tr)## Community sizes
## 1 2 3
## 8 8 3
sizes(op_knn)## Community sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Modularidade
# tem maior modularidade
modularity(op_tr)## [1] 0.09812146
# não tem estrutura de comunidade
modularity(op_knn)## [1] 0
Comunidades
communities(op_tr)## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
##
## $`3`
## [1] "Dark.eyed.Junco" "Warbling.Vireo" "Stellar.s.Jay"
communities(op_knn)## $`1`
## [1] "Brown.Creeper"
##
## $`2`
## [1] "Pacific.Wren"
##
## $`3`
## [1] "Pacific.slope.Flycatcher"
##
## $`4`
## [1] "Red.breasted.Nuthatch"
##
## $`5`
## [1] "Dark.eyed.Junco"
##
## $`6`
## [1] "Olive.sided.Flycatcher"
##
## $`7`
## [1] "Hermit.Thrush"
##
## $`8`
## [1] "Chestnut.backed.Chickadee"
##
## $`9`
## [1] "Varied.Thrush"
##
## $`10`
## [1] "Hermit.Warbler"
##
## $`11`
## [1] "Swainson.s.Thrush"
##
## $`12`
## [1] "Hammond.s.Flycatcher"
##
## $`13`
## [1] "Western.Tanager"
##
## $`14`
## [1] "Black.headed.Grosbeak"
##
## $`15`
## [1] "Golden.Crowned.Kinglet"
##
## $`16`
## [1] "Warbling.Vireo"
##
## $`17`
## [1] "MacGillivray.s.Warbler"
##
## $`18`
## [1] "Stellar.s.Jay"
##
## $`19`
## [1] "Common.Nighthawk"
É hierárquico?
is_hierarchical(op_tr)## [1] FALSE
is_hierarchical(op_knn)## [1] FALSE
O algoritmo é composto por duas fases que são repetidas iterativamente. O algoritmo encontra comunidades hierarquicas.
Fase 1:
Começa com cada vértice em uma comunidade diferente (cada vértice é uma comunidade)
Para cada vértice, considere os j vértices vizinhos do vértice i.
Avalie o ganho da modularidade quando i é removido de sua comunidade e colocado na comunidade j
O vértice i é então fixado na comunidade para a qual o ganho da modularidade é máximo e positivo
Se não há ganho positivo, i permance na comunidade original.
Esse processo se repete e só pára quando um máximo local da modularidade é alcançado, ou seja, quando nenhum movimento de vértice é capaz de maximizar a modularidade
Fase 2:
Parâmetros
GRAPH: grafo.
WEIGTHS: pesos
Aplicando o método
lo_tr = cluster_louvain(jaccard_graph_tr,
weights = jaccard_graph_tr$weights)
lo_knn = cluster_louvain(jaccard_graph_knn,
weights = jaccard_graph_knn$weights)Plol
par(mfrow=c(1,2))
plotar(lo_tr, jaccard_graph_tr, "Louvain threshold")
plotar(lo_knn, jaccard_graph_knn, "Louvain Eigenvector knn")Informações
lo_tr## IGRAPH clustering multi level, groups: 3, mod: 0.097
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Olive.sided.Flycatcher"
## [5] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
## [9] "Stellar.s.Jay"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "MacGillivray.s.Warbler" "Hermit.Warbler"
## + ... omitted several groups/vertices
lo_knn## IGRAPH clustering multi level, groups: 19, mod: 8.2e-18
## + groups:
## $`1`
## [1] "Brown.Creeper"
##
## $`2`
## [1] "Pacific.Wren"
##
## $`3`
## [1] "Pacific.slope.Flycatcher"
##
## $`4`
## + ... omitted several groups/vertices
Membros de cada comunidade
membership(lo_tr)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 3 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 3
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 3 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 1
membership(lo_knn)## Brown.Creeper Pacific.Wren Pacific.slope.Flycatcher
## 1 2 3
## Red.breasted.Nuthatch Dark.eyed.Junco Olive.sided.Flycatcher
## 4 5 6
## Hermit.Thrush Chestnut.backed.Chickadee Varied.Thrush
## 7 8 9
## Hermit.Warbler Swainson.s.Thrush Hammond.s.Flycatcher
## 10 11 12
## Western.Tanager Black.headed.Grosbeak Golden.Crowned.Kinglet
## 13 14 15
## Warbling.Vireo MacGillivray.s.Warbler Stellar.s.Jay
## 16 17 18
## Common.Nighthawk
## 19
As comunidades tem tamanhos diferentes
sizes(lo_tr)## Community sizes
## 1 2 3
## 9 7 3
sizes(lo_knn)## Community sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
O primeiro grafo tem maior modularidade
modularity(lo_tr)## [1] 0.09682183
modularity(lo_knn)## [1] 8.239937e-18
Grupos
communities(lo_tr)## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Pacific.slope.Flycatcher" "Olive.sided.Flycatcher"
## [5] "Chestnut.backed.Chickadee" "Warbling.Vireo"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
## [9] "Stellar.s.Jay"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "MacGillivray.s.Warbler" "Hermit.Warbler"
## [7] "Common.Nighthawk"
##
## $`3`
## [1] "Hammond.s.Flycatcher" "Dark.eyed.Junco" "Western.Tanager"
communities(lo_knn)## $`1`
## [1] "Brown.Creeper"
##
## $`2`
## [1] "Pacific.Wren"
##
## $`3`
## [1] "Pacific.slope.Flycatcher"
##
## $`4`
## [1] "Red.breasted.Nuthatch"
##
## $`5`
## [1] "Dark.eyed.Junco"
##
## $`6`
## [1] "Olive.sided.Flycatcher"
##
## $`7`
## [1] "Hermit.Thrush"
##
## $`8`
## [1] "Chestnut.backed.Chickadee"
##
## $`9`
## [1] "Varied.Thrush"
##
## $`10`
## [1] "Hermit.Warbler"
##
## $`11`
## [1] "Swainson.s.Thrush"
##
## $`12`
## [1] "Hammond.s.Flycatcher"
##
## $`13`
## [1] "Western.Tanager"
##
## $`14`
## [1] "Black.headed.Grosbeak"
##
## $`15`
## [1] "Golden.Crowned.Kinglet"
##
## $`16`
## [1] "Warbling.Vireo"
##
## $`17`
## [1] "MacGillivray.s.Warbler"
##
## $`18`
## [1] "Stellar.s.Jay"
##
## $`19`
## [1] "Common.Nighthawk"
Não são hierárquicos
is_hierarchical(lo_tr)## [1] FALSE
is_hierarchical(lo_knn)## [1] FALSE
No artigo original, o autores mostraram que detecção de comunidades podem ser mapeados de forma a encontrar o estado fundamental de um spin glass de Potts de alcance infinito a partir de um ansatz de um parâmetro muito simples e geral, que também é válido para redes ponderadas e redes direcionadas.
Portanto, a estrutura é interpretada como uma nova configuração de glass que minimiza a energia do spin glass com o estado do glass sendo os índices das comunidades. Ao usar modelos de rotação para agrupamento, as medidas de similaridaes são traduzidas em forças e propriedades dinâmicas tais como correlações spin-spin que são medidas ou energias interpretadas como funções de qualidade.
Assim, os métodos de detecção de comunidade podem ser mapeados para encontrar o estado verdadeiro de um spin glass de Potts de faixa infinita via o princípio de anatz e combinando informações ausentes e presentes.
A energia do sistema de rotação é equivalente à função de qualifidade do agrupamento com o estado da rotação sendo o indice do grupo.
Parametros
GRAPH: grafo
WEIGHTS: pesos
VERTEX: se deve ser calculada a comunidade de um determinado vértice sem calcular todas as comunidades. Observe que, se este argumento estiver presente, alguns outros argumentos serão ignorados.
SPINS: é o número de giros a serem usados. Este é o limite máximo para o número de comunidades. Não é um problema fornecer um número (razoavelmente) grande aqui, caso em que alguns estados de spin não serão preenchidos.
PARAUPDATE: indica se os spins dos vértices devem ser atualizados em paralelo de forma síncrona ou não. Este argumento é ignorado se o parâmetro VERTEX estiver presente. Também não é implementado na opção “neg”.
START.TEMP: é a temperatura inicial. Se o parâmetro VERTEX estiver presente então este parametro é ignorado.
STOP.TEMP: é a temperatura de parada. A simulação termina se a temperatura cair abaixo deste nível. Se o parâmetro VERTEX estiver presente então este parametro é ignorado.
COOL.FACT: fator de resfriamento para o recozimento simulado. Se o parâmetro VERTEX estiver presente então este parametro é ignorado.
UPDATE.RULE: tipo de grafo a ser usado dado o modelo nulo da simulação. O valor Simples usa um grafo aleatório com o mesmo número de arestas que a probabilidade da linha de base. O valor Config usa um grafo aleatório com os mesmos graus de vértice do gráfico de entrada.
GAMMA: este parametro numérico especifica o equilíbrio entre a importância das bordas presentes e não presentes em uma comunidade. O valor padrão 1.0 torna os links existentes e não existentes igualmente importantes. Valores menores tornam os links existentes, valores maiores tornam os links ausentes mais importantes.
IMPLEMENTANTION: é o tipo de implementação do algoritmo que se deseja usar. A original é mais rápida e é o padrão sendo indicada por orig. A segunda leva em consideração pesos negativos sendo indicada por neg
GAMMA.MINUS: este parâmetro numérico especifica o equilíbrio entre a importância das arestas ponderadas negativas presentes e não presentes em uma comunidade. Valores menores levam a comunidades com menor intra-conectividade negativa. Se este argumento for definido como zero, o algoritmo se reduz a um algoritmo de coloração de grafo, usando o número de spins como o número de cores. Este argumento é ignorado se a implementação original for escolhida.
Aplicando o método
sc1 = spinglass.community(jaccard_graph_tr,
weights = jaccard_graph_tr$weights_cond_prob,
implementation = "orig",
update.rule = "config")
sc2 = spinglass.community(jaccard_graph_tr,
weights = jaccard_graph_tr$weights_cond_prob,
implementation = "orig",
update.rule = "random")
sc3 = spinglass.community(jaccard_graph_tr,
weights = jaccard_graph_tr$weights_cond_prob,
implementation = "orig",
update.rule = "simple")
sc4 = spinglass.community(jaccard_graph_tr,
weights = jaccard_graph_tr$weights_cond_prob,
implementation = "neg",
update.rule = "config")
sc5 = spinglass.community(jaccard_graph_tr,
weights = jaccard_graph_tr$weights_cond_prob,
implementation = "neg",
update.rule = "random")
sc6 = spinglass.community(jaccard_graph_tr,
weights = jaccard_graph_tr$weights_cond_prob,
implementation = "neg",
update.rule = "simple")Plots
par(mfrow=c(1,2))
plotar(sc1, jaccard_graph_tr, "Spinglass TR OR CO")
plotar(sc2, jaccard_graph_tr, "Spinglass TR OR RA")par(mfrow=c(1,2))
plotar(sc3, jaccard_graph_tr, "Spinglass TR OR SI")
plotar(sc4, jaccard_graph_tr, "Spinglass TR NE CO")par(mfrow=c(1,2))
plotar(sc5, jaccard_graph_tr, "Spinglass TR NE RA")
plotar(sc6, jaccard_graph_tr, "Spinglass TR NE SI")Informações das comunidades
sc1## IGRAPH clustering spinglass, groups: 3, mod: 0.15
## + groups:
## $`1`
## [1] "Dark.eyed.Junco" "Warbling.Vireo" "Stellar.s.Jay"
##
## $`2`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`3`
## + ... omitted several groups/vertices
sc2## IGRAPH clustering spinglass, groups: 19, mod: -0.015
## + groups:
## $`1`
## [1] "Olive.sided.Flycatcher"
##
## $`2`
## [1] "Common.Nighthawk"
##
## $`3`
## [1] "Black.headed.Grosbeak"
##
## $`4`
## + ... omitted several groups/vertices
sc3## IGRAPH clustering spinglass, groups: 19, mod: -0.015
## + groups:
## $`1`
## [1] "Western.Tanager"
##
## $`2`
## [1] "Stellar.s.Jay"
##
## $`3`
## [1] "Dark.eyed.Junco"
##
## $`4`
## + ... omitted several groups/vertices
sc4## IGRAPH clustering spinglass, groups: 3, mod: 0.098
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.slope.Flycatcher"
## [3] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [5] "Warbling.Vireo" "Brown.Creeper"
## [7] "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Dark.eyed.Junco" "Western.Tanager"
## [7] "MacGillivray.s.Warbler" "Hermit.Warbler" "Common.Nighthawk"
## + ... omitted several groups/vertices
sc5## IGRAPH clustering spinglass, groups: 3, mod: 0.098
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.slope.Flycatcher"
## [3] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [5] "Warbling.Vireo" "Brown.Creeper"
## [7] "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Dark.eyed.Junco" "Western.Tanager"
## [7] "MacGillivray.s.Warbler" "Hermit.Warbler" "Common.Nighthawk"
## + ... omitted several groups/vertices
sc6## IGRAPH clustering spinglass, groups: 3, mod: 0.098
## + groups:
## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
## + ... omitted several groups/vertices
Informações de membership
membership(sc1)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 2 3 2
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 2 3 3
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 2 3 1
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 2 3 2
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 3 1 2
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 3 3 2
## Stellar.s.Jay
## 1
membership(sc2)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 16 18 13
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 12 5 3
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 8 14 19
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 15 6
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 9 11 17
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 7 2 4
## Stellar.s.Jay
## 10
membership(sc3)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 16 19 15
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 18 12 17
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 9 11 3
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 7 1 13
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 14 6 10
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 5 8 4
## Stellar.s.Jay
## 2
membership(sc4)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 3
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 3 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 2
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 2 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 3
membership(sc5)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 3
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 3 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 2
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 2 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 1 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 3
membership(sc6)## Varied.Thrush Golden.Crowned.Kinglet Pacific.Wren
## 1 2 1
## Hammond.s.Flycatcher Swainson.s.Thrush Black.headed.Grosbeak
## 1 2 2
## Pacific.slope.Flycatcher Hermit.Thrush Dark.eyed.Junco
## 1 2 3
## Olive.sided.Flycatcher Western.Tanager Chestnut.backed.Chickadee
## 1 2 1
## MacGillivray.s.Warbler Warbling.Vireo Brown.Creeper
## 2 3 1
## Hermit.Warbler Common.Nighthawk Red.breasted.Nuthatch
## 2 2 1
## Stellar.s.Jay
## 3
Informações de tamanho
sizes(sc1)## Community sizes
## 1 2 3
## 3 8 8
sizes(sc2)## Community sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
sizes(sc3)## Community sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
sizes(sc4)## Community sizes
## 1 2 3
## 7 9 3
sizes(sc5)## Community sizes
## 1 2 3
## 7 9 3
sizes(sc6)## Community sizes
## 1 2 3
## 8 8 3
Informações de modularidade
# entre as 6 comunidades esta obteve a melhor qualidade
modularity(sc1) ## [1] 0.1522478
# valor negativo: péssima qualidade de particionamento
modularity(sc2) ## [1] -0.01537394
# valor negativo: péssima qualidade de particionamento
modularity(sc3)## [1] -0.01537394
# no geral, as modularidades foram baixas, muito próximas de zero
# isso indica que a qualidade dos particionamentos não são muito boas
# quanto mais próximo de 1 melhor
# valores normais ficam entre 0.3 e 0.7
modularity(sc4)## [1] 0.09764887
modularity(sc5)## [1] 0.09764887
modularity(sc6)## [1] 0.09812146
Grupos
communities(sc1)## $`1`
## [1] "Dark.eyed.Junco" "Warbling.Vireo" "Stellar.s.Jay"
##
## $`2`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`3`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
communities(sc2)## $`1`
## [1] "Olive.sided.Flycatcher"
##
## $`2`
## [1] "Common.Nighthawk"
##
## $`3`
## [1] "Black.headed.Grosbeak"
##
## $`4`
## [1] "Red.breasted.Nuthatch"
##
## $`5`
## [1] "Swainson.s.Thrush"
##
## $`6`
## [1] "Chestnut.backed.Chickadee"
##
## $`7`
## [1] "Hermit.Warbler"
##
## $`8`
## [1] "Pacific.slope.Flycatcher"
##
## $`9`
## [1] "MacGillivray.s.Warbler"
##
## $`10`
## [1] "Stellar.s.Jay"
##
## $`11`
## [1] "Warbling.Vireo"
##
## $`12`
## [1] "Hammond.s.Flycatcher"
##
## $`13`
## [1] "Pacific.Wren"
##
## $`14`
## [1] "Hermit.Thrush"
##
## $`15`
## [1] "Western.Tanager"
##
## $`16`
## [1] "Varied.Thrush"
##
## $`17`
## [1] "Brown.Creeper"
##
## $`18`
## [1] "Golden.Crowned.Kinglet"
##
## $`19`
## [1] "Dark.eyed.Junco"
communities(sc3)## $`1`
## [1] "Western.Tanager"
##
## $`2`
## [1] "Stellar.s.Jay"
##
## $`3`
## [1] "Dark.eyed.Junco"
##
## $`4`
## [1] "Red.breasted.Nuthatch"
##
## $`5`
## [1] "Hermit.Warbler"
##
## $`6`
## [1] "Warbling.Vireo"
##
## $`7`
## [1] "Olive.sided.Flycatcher"
##
## $`8`
## [1] "Common.Nighthawk"
##
## $`9`
## [1] "Pacific.slope.Flycatcher"
##
## $`10`
## [1] "Brown.Creeper"
##
## $`11`
## [1] "Hermit.Thrush"
##
## $`12`
## [1] "Swainson.s.Thrush"
##
## $`13`
## [1] "Chestnut.backed.Chickadee"
##
## $`14`
## [1] "MacGillivray.s.Warbler"
##
## $`15`
## [1] "Pacific.Wren"
##
## $`16`
## [1] "Varied.Thrush"
##
## $`17`
## [1] "Black.headed.Grosbeak"
##
## $`18`
## [1] "Hammond.s.Flycatcher"
##
## $`19`
## [1] "Golden.Crowned.Kinglet"
communities(sc4)## $`1`
## [1] "Varied.Thrush" "Pacific.slope.Flycatcher"
## [3] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [5] "Warbling.Vireo" "Brown.Creeper"
## [7] "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Dark.eyed.Junco" "Western.Tanager"
## [7] "MacGillivray.s.Warbler" "Hermit.Warbler" "Common.Nighthawk"
##
## $`3`
## [1] "Pacific.Wren" "Hammond.s.Flycatcher" "Stellar.s.Jay"
communities(sc5)## $`1`
## [1] "Varied.Thrush" "Pacific.slope.Flycatcher"
## [3] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [5] "Warbling.Vireo" "Brown.Creeper"
## [7] "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Dark.eyed.Junco" "Western.Tanager"
## [7] "MacGillivray.s.Warbler" "Hermit.Warbler" "Common.Nighthawk"
##
## $`3`
## [1] "Pacific.Wren" "Hammond.s.Flycatcher" "Stellar.s.Jay"
communities(sc6)## $`1`
## [1] "Varied.Thrush" "Pacific.Wren"
## [3] "Hammond.s.Flycatcher" "Pacific.slope.Flycatcher"
## [5] "Olive.sided.Flycatcher" "Chestnut.backed.Chickadee"
## [7] "Brown.Creeper" "Red.breasted.Nuthatch"
##
## $`2`
## [1] "Golden.Crowned.Kinglet" "Swainson.s.Thrush" "Black.headed.Grosbeak"
## [4] "Hermit.Thrush" "Western.Tanager" "MacGillivray.s.Warbler"
## [7] "Hermit.Warbler" "Common.Nighthawk"
##
## $`3`
## [1] "Dark.eyed.Junco" "Warbling.Vireo" "Stellar.s.Jay"
É hierárquico
is_hierarchical(sc1)## [1] FALSE
is_hierarchical(sc2)## [1] FALSE
is_hierarchical(sc3)## [1] FALSE
is_hierarchical(sc4)## [1] FALSE
is_hierarchical(sc5)## [1] FALSE
is_hierarchical(sc6)## [1] FALSE
Silva, T. C.; Zhao, L. Machine Learning in Complex Networks (1st. ed.). Springer Publishing Company, Incorporated. 2016. https://dl.acm.org/doi/book/10.5555/2898937
Freeman, L.C. (1979). Centrality in Social Networks I: Conceptual Clarification. Social Networks, 1, 215-239. https://www.sciencedirect.com/science/article/abs/pii/0378873378900217
Ulrik Brandes, A Faster Algorithm for Betweenness Centrality. Journal of Mathematical Sociology 25(2):163-177, 2001. https://www.tandfonline.com/doi/abs/10.1080/0022250X.2001.9990249
Bonacich, P. (1987). Power and Centrality: A Family of Measures. American Journal of Sociology, 92, 1170-1182. https://www.jstor.org/stable/2780000
Clauset, A.; Newman, M. E. J. & Moore, C. Finding community structure in very large networks, Physical Review E 2004, 70, 066111. https://arxiv.org/abs/cond-mat/0408187
Vincent D. Blondel, Jean-Loup Guillaume, Renaud Lambiotte, Etienne Lefebvre: Fast unfolding of communities in large networks. J. Stat. Mech. (2008) P10008. https://arxiv.org/abs/0803.0476
J. Reichardt and S. Bornholdt: Statistical Mechanics of Community Detection, Phys. Rev. E, 74, 016110 (2006), https://arxiv.org/abs/cond-mat/0603718
M. E. J. Newman and M. Girvan: Finding and evaluating community structure in networks, Phys. Rev. E 69, 026113 (2004) https://arxiv.org/abs/cond-mat/0308217
V.A. Traag and Jeroen Bruggeman: Community detection in networks with positive and negative links, https://arxiv.org/abs/0811.2329 (2008).
Ulrik Brandes, Daniel Delling, Marco Gaertler, Robert Gorke, Martin Hoefer, Zoran Nikoloski, Dorothea Wagner: On Modularity Clustering, IEEE Transactions on Knowledge and Data Engineering 20(2):172-188, 2008. https://ieeexplore.ieee.org/document/4358966
MEJ Newman: Finding community structure using the eigenvectors of matrices, Physical Review E 74 036104, 2006. https://arxiv.org/abs/physics/0605087
Javed, M. A., Younis, M. S., Latif, S., Qadir, J., & Baig, A. (2018). Community detection in networks: A multidisciplinary review. Journal of Network and Computer Applications, 108(January), 87–111. https://doi.org/10.1016/j.jnca.2018.02.011
Raghavan, U.N. and Albert, R. and Kumara, S.: Near linear time algorithm to detect community structures in large-scale networks. Phys Rev E 76, 036106. (2007) https://arxiv.org/abs/0709.2938
Pascal Pons, Matthieu Latapy: Computing communities in large networks using random walks, https://arxiv.org/abs/physics/0512106
Yang, Z., Algesheimer, R., & Tessone, C. J. (2016). A comparative analysis of community detection algorithms on artificial networks. Scientific Reports, 6(March). https://doi.org/10.1038/srep30750
Smith, N. R., Zivich, P. N., Frerichs, L. M., Moody, J., & Aiello, A. E. (2020). A Guide for Choosing Community Detection Algorithms in Social Network Studies: The Question Alignment Approach. American Journal of Preventive Medicine, 59(4), 597–605. https://doi.org/10.1016/j.amepre.2020.04.015
Huang, X., Chen, D., Ren, T., & Wang, D. (2020). A survey of community detection methods in multilayer networks. In Data Mining and Knowledge Discovery. Springer US. https://doi.org/10.1007/s10618-020-00716-6
Mittal, R., & Bhatia, M. P. S. (2020). Classification and Comparative Evaluation of Community Detection Algorithms. Archives of Computational Methods in Engineering, 0123456789. https://doi.org/10.1007/s11831-020-09421-5
Resende, V. H., & Carneiro, M. G. (2019). Towards a high-level multi-label classification from complex networks. Proceedings - International Conference on Tools with Artificial Intelligence, ICTAI, 2019-November(Cml), 1140–1147. https://doi.org/10.1109/ICTAI.2019.00159