Вы не сможете (я не верю) сравнить алгоритмы кластеризации из двух разных графов, которые содержат два разных набора узлов.Практически вы не можете сделать это в igraph
, и концептуально это сложно, потому что сравнение алгоритмов кластеризации заключается в рассмотрении всех пар узлов в графе и проверке, расположены ли они в одном кластере или в другом кластере в каждом издва кластерных подхода.Если оба подхода к кластеризации обычно объединяют одни и те же узлы и разделяют одни и те же узлы, то они считаются более похожими. 1
Я полагаю, что другим подходящим способом решения проблемы является оценка того, насколько похожисхемы кластеризации предназначены исключительно для множества узлов, которые являются пересечением двух графов.Вы должны решить, что имеет больше смысла в вашей обстановке.Я покажу, как это сделать, используя объединение узлов, а не пересечение.
Поэтому для сравнения необходимо использовать все одинаковые узлы на обоих графиках.На самом деле, я думаю, что самый простой способ сделать это - поместить все одни и те же узлы в один граф и иметь разные типы ребер.Затем вы можете рассчитать свои кластеры для каждого типа ребер отдельно, а затем сделать сравнение.Надеемся, что приведенное ниже представление ясно:
# repeat your set-up
library(tidyverse, warn.conflicts = FALSE)
library(igraph, warn.conflicts = FALSE)
nodes <- as_tibble(list(id = c("sample1", "sample2", "sample3")))
edge <- as_tibble(list(from = "sample1",
to = "sample2"))
nodes2 <- as_tibble(list(id = c("sample1","sample21", "sample22","sample23")))
edge2 <- as_tibble(list(from = c("sample1", "sample21"),
to = c("sample21", "sample22")))
# approach from a single graph
# concatenate edges
edges <- rbind(edge, edge2)
# create an edge attribute indicating network type
edges$type <- c("phone", "email", "email")
# the set of nodes (across both graphs)
nodes <- unique(rbind(nodes, nodes2))
g <- graph_from_data_frame(d = edges, vertices = nodes, directed = F)
# We cluster over the graph without the email edges
com_phone <- cluster_louvain(g %>% delete_edges(E(g)[E(g)$type=="email"]))
plot(g, mark.groups = com_phone)
# Now we can cluster over the graph without the phone edges
com_email <- cluster_louvain(g %>% delete_edges(E(g)[E(g)$type=="phone"]))
plot(g, mark.groups = com_email)
# Now we can compare
compare(com_phone, com_email)
#> [1] 0.7803552
Как видно из графиков, которые мы выбираемта же самая исходная структура кластеризации, которую вы обнаружили на отдельных графиках с добавлением дополнительных изолированных узлов.
1: Очевидно, это довольно расплывчатое объяснение.Алгоритм по умолчанию, используемый в compare
, взят из этой статьи , с которой приятно поговорить.