извлекать группы из матрицы расстояний с помощью дерева разрезов в R

Я начал со списка увлечений и людей, я хотел сгруппировать этих людей по их общим увлечениям. Итак, я создал матрицу расстояний, затем применил иерархическую кластеризацию и разрез, чтобы сгруппировать кластеризацию в определенное количество кластеров. Теперь у меня есть матрица cutree, но я не знаю, как извлечь из нее кластеры. Не могли бы вы посоветовать?

Вот пример того, что я имею в виду.

Матрица расстояний:

       one    three   two
one     0      1.0    1.0
three   1      0.0    0.5
two     1      0.5    0.0

Затем я использовал hclust и cutree и получил такой результат:

hc <- hclust(dist, method="ward")
ct <- cutree(hc, k=1:3)
        1       2      3
one     1       1      1
three   1       2      2
two     1       2      3

Как мне получить список людей, которые принадлежат к одному кластеру?

Спасибо за помощь.


person user1375640    schedule 03.01.2014    source источник
comment
Как вы создали матрицу расстояний?   -  person jlhoward    schedule 04.01.2014


Ответы (2)


Ваш k=1:3 предоставит прогнозируемый кластер для каждого из $ k = {1, 2, 3} $. Если вы хотите объединить группы в соответствии с кластером, предположите, что WLOG, что 2 - это количество интересующих вас кластеров, вам просто нужно объединить имена столбца матрицы с записями столбца матрицы.

Пример:

hc <- hclust(dist(USArrests))
memb <- cutree(hc, k = 1:5)
tapply(names(memb[, 3]), memb[, 3], c) ## say we're interested in 3 clusters
person AdamO    schedule 03.01.2014

ct - это матрица, поэтому вы можете индексировать столбцы, чтобы получить членство для групп размером 1: 3. Например,

cp[, 2]

дает нетривиальное решение отнесения 3 наблюдений к 2 группам.

Чтобы получить наблюдения в каждом кластере, используя ваши данные:

Dij <- matrix(c(0, 1.0, 1.0,
                1, 0.0, 0.5,
                1, 0.5, 0.0), ncol = 3, byrow = TRUE)
rownames(Dij) <- colnames(Dij) <- c("one", "two", "three")
hc <- hclust(as.dist(Dij), method="ward")
ct <- cutree(hc, k=1:3)

вы можете использовать функцию split() для разделения имен строк ct (которые являются идентификаторами ваших наблюдений / выборок из матрицы расстояний, Dij), разбивая это на вектор принадлежности из любого столбца ct, который вы хотите использовать. Например.

> split(rownames(ct), ct[,2])
$`1`
[1] "one"

$`2`
[1] "two"   "three"
person Gavin Simpson    schedule 03.01.2014