Получение иерархии кластеров и назначений вложенных кластеров

В настоящее время я изучаю иерархию в темах документов. В качестве первого шага я нахожу векторное представление своих документов, после чего использую иерархическую кластеризацию, чтобы определить, есть ли темы в темах документа. Я хочу рассматривать только (вложенные) кластеры, которые содержат, скажем, 2% исходных данных. Для этого я использую R.

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

Мой окончательный вывод должен выглядеть примерно так: будет два стола

Кластерные задания:

docID , ClusterLabel
1, A
2, A
3, B
4, B
5, B
3, C
4, D
5, C 
...

Иерархия кластера:

Parent, Child
B, C
B, D
...

Как видите, наблюдения 3, 4 и 5 встречаются несколько раз в таблице назначения кластеров, где один из кластеров является подкластером своего родительского кластера. Это можно увидеть в таблице Hierarchy.

Мой текущий подход заключается в том, что я использую функцию cutree.dendogram из пакета «Dendextend», чтобы найти назначение кластера для сетки значений k, а затем вывести иерархию кластера и назначения из вывода. Однако этот подход очень наивен и становится ужасно медленным для большого количества наблюдений и кластеров.

Будем очень признательны за предложения по эффективному решению этой проблемы, желательно с использованием доступных пакетов.

РЕДАКТИРОВАТЬ: Рассмотрим следующий пример, соответствующий образцу выходных данных:

data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2)
plot(data)

hc<- hclust(dist(data))
plot(hc)

Если бы мы разрезали дерево на высоте 6, то на выходе получили бы 2 кластера с именами A и B. Однако, если бы мы обрезали дерево на высоте 4, у нас было бы 3 кластера с именами A, C и D на выходе. Теперь, например, наблюдение с docID 3 находится либо в кластере B, либо в кластере C (в зависимости от высоты, которую мы вырезаем в дереве), что соответствует двум записям в назначении выборочного выходного кластера. Кластер B разделен на два кластера C и D, что можно увидеть в выходных данных иерархии кластеров.

Теперь моя цель — получить полный список назначений и иерархий кластеров, двигаясь вниз по дендрограмме. (предпочтительно останавливаться, когда количество наблюдений в (под)кластере становится меньше определенного количества наблюдений)

До сих пор мне не удавалось придумать разумный эффективный метод для этого, надеюсь, кто-нибудь может дать мне идею.


person BDP1    schedule 08.05.2017    source источник
comment
Привет @ Bartdp1, не могли бы вы обновить свой вопрос автономным воспроизводимым примером?   -  person Tal Galili    schedule 08.05.2017
comment
@TalGalili я обновил вопрос, спасибо, что заглянули   -  person BDP1    schedule 08.05.2017


Ответы (1)


Параметр k в функции cutree может принимать вектор значений, и вывод будет выглядеть так:

> data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2)
> hc<- hclust(dist(data))
> cutree(hc, k = 1:5)
     1 2 3 4 5
[1,] 1 1 1 1 1
[2,] 1 1 1 2 2
[3,] 1 1 2 3 3
[4,] 1 2 3 4 4
[5,] 1 2 3 4 5

Отвечает ли это на ваш вопрос?

person Tal Galili    schedule 08.05.2017
comment
Не совсем так, обратите внимание, что при переходе от 2 к 3 кластерам кластер 1 в столбце 2 разбивается на два кластера, называемых кластером 1 и кластером 2 в столбце 3. Последние два являются дочерними элементами первого. Я хочу сохранить различие между ними двумя, поэтому у них должны быть разные метки (теперь это не так, поскольку метка 1 встречается дважды). Конечно, я вижу, что все это можно получить из предоставленных вами выходных данных, но это было бы довольно дорого, учитывая, что информация легко доступна из дендрограммы. Я просто не вижу, как извлечь его эффективно. - person BDP1; 09.05.2017
comment
Я не уверен, что следую. Вы хотите, чтобы во втором столбце было только 2 и 3, а в третьем — 3,4,5 и т. д.? - person Tal Galili; 09.05.2017
comment
Не персе. Сначала я хочу извлечь из вывода hclust образец вывода, как показано в исходном вопросе. Итак, я хочу список с кластерными назначениями. Наблюдения встречаются в этом списке несколько раз, поскольку при объединении кластеров в иерархической кластеризации наблюдения находятся как в родительском, так и в дочернем кластере. Кроме того, я хотел бы получить список отношений родителей и детей. Для справки, я не уверен, что у Dendextend есть эта функциональность (или ее части, которые нужно использовать), но я надеялся на толчок в правильном направлении в том, как эффективно кодировать это. - person BDP1; 18.05.2017