В настоящее время я изучаю иерархию в темах документов. В качестве первого шага я нахожу векторное представление своих документов, после чего использую иерархическую кластеризацию, чтобы определить, есть ли темы в темах документа. Я хочу рассматривать только (вложенные) кластеры, которые содержат, скажем, 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, что можно увидеть в выходных данных иерархии кластеров.
Теперь моя цель — получить полный список назначений и иерархий кластеров, двигаясь вниз по дендрограмме. (предпочтительно останавливаться, когда количество наблюдений в (под)кластере становится меньше определенного количества наблюдений)
До сих пор мне не удавалось придумать разумный эффективный метод для этого, надеюсь, кто-нибудь может дать мне идею.