R: igraph, сопоставление членов «известного» кластера с членами наблюдаемых кластеров, возвращающих% соответствия - PullRequest
1 голос
/ 28 марта 2012

Я использую метод обнаружения сообщества Walktrap, чтобы вернуть количество (в данном случае 19) кластеров.У меня есть список членов, которые принадлежат к одному или нескольким из этих кластеров.

  1. Мне нужен метод, чтобы искать в каждом кластере наличие членов и возвращать процент найденных совпадений.(например, cluster [0] = 0%, cluster [1] = Y% ..... cluster [18] = Z%). Таким образом, выбирается оптимальный кластер, который представляет членов в списке.

  2. Как только оптимальный кластер найден, мне нужен метод для подсчета количества членов оптимального кластера, и из исходных (19-1) кластеров выберите другой кластер, ближайший кразмер (количество членов)

     library(igraph)
     edges <- read.csv('http://dl.dropbox.com/u/23776534/Facebook%20%5BEdges%5D.csv')
     list<-read.csv("http://dl.dropbox.com/u/23776534/knownlist.csv")
     all<-graph.data.frame(edges)
     summary(all)
    all_wt<- walktrap.community(all, steps=6,modularity=TRUE,labels=TRUE)
    all_wt_memb <- community.to.membership(all,all_wt$merges,steps=which.max(all_wt$modularity)-1)
    all_wt_memb$csize
    
    >[1] 176  13 204  24   9 263  16   2   8   4  12   8   9  19  15   3   6   2   1
    

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Функция %in%, когда используется как: a %in% b, будет определять, какие из элементов в векторе a также присутствуют в векторе b. Так что для каждого кластера я бы

  • Извлечение членов этого кластера
  • Учитывая список членов, в которых вы заинтересованы, подсчитайте, какие из них %in% этот кластер - который вернет логический вектор
  • Вы можете использовать sum() на булевом векторе для подсчета количества истинных элементов (то есть количества элементов в вашем начальном векторе, которые присутствуют в этом кластере
  • (При желании) вы можете нормализовать по длине кластера, чтобы получить процент этого кластера, который состоит из вашего списка интересов, или по длине списка, который вы составили, чтобы указать количество членов в вашем список, которые присутствуют в этом кластере.

Вы можете проходить через каждый кластер, используя for() или вариант apply.

Затем, учитывая all_wt_memb$csize, у вас будет заданное значение, которое является вашей целью, и вы захотите найти ближайшее число. См. эту ссылку , но вы просто рассчитываете минимальную абсолютную разницу:

x=c(1:100)
your.number=5.43
which(abs(x-your.number)==min(abs(x-your.number)))
0 голосов
/ 28 марта 2012

Это даст вам индекс для второго по величине all_wt_memb:

dat <- all_wt_memb$csize
order( dat- dat[which.max(dat)])[ length(dat)-1]
[1] 3
...