Список кластеризации для функции hclust

Используя метод plot(hclust(dist(x))), я смог нарисовать карту дерева кластеров. Оно работает. Тем не менее, я хотел бы получить список всех кластеров, а не древовидную диаграмму, потому что у меня огромный объем данных (например, 150 тыс. Узлов), и график становится беспорядочным.

Другими словами, допустим, если a b c - кластер, а если d e f g - кластер, тогда я хотел бы получить что-то вроде этого:

1 a,b,c
2 d,e,f,g

Обратите внимание, что это не совсем то, что я хочу получить в качестве «вывода». Это просто пример. Я просто хотел бы иметь возможность получить список кластеров вместо древовидного графика. Это может быть вектор, матрица или просто числа, показывающие, к каким группам принадлежат элементы.

Как это возможно?


person dave    schedule 29.06.2011    source источник
comment
Это может помочь. stackoverflow.com/questions/28378113/   -  person janicebaratheon    schedule 07.02.2015


Ответы (2)


Я буду использовать набор данных, доступный в R, чтобы продемонстрировать, как разрезать дерево на желаемое количество частей. Результат - таблица.

Создайте объект hclust.

hc <- hclust(dist(USArrests), "ave")
#plot(hc)

Теперь вы можете разрезать дерево на столько веток, сколько захотите. Для следующего трюка я разделю дерево на две группы. Вы устанавливаете количество разрезов с помощью параметра k. См. ?cutree и использование параметра h, который может быть для вас более полезным (см. cutree(hc, k = 2) == cutree(hc, h = 110)).

cutree(hc, k = 2)
       Alabama         Alaska        Arizona       Arkansas     California 
             1              1              1              2              1 
      Colorado    Connecticut       Delaware        Florida        Georgia 
             2              2              1              1              2 
        Hawaii          Idaho       Illinois        Indiana           Iowa 
             2              2              1              2              2 
        Kansas       Kentucky      Louisiana          Maine       Maryland 
             2              2              1              2              1 
 Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
             2              1              2              1              2 
       Montana       Nebraska         Nevada  New Hampshire     New Jersey 
             2              2              1              2              2 
    New Mexico       New York North Carolina   North Dakota           Ohio 
             1              1              1              2              2 
      Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
             2              2              2              2              1 
  South Dakota      Tennessee          Texas           Utah        Vermont 
             2              2              2              2              2 
      Virginia     Washington  West Virginia      Wisconsin        Wyoming 
             2              2              2              2              2
person Roman Luštrik    schedule 29.06.2011
comment
превосходно! Спасибо. Это заставляет меня задуматься, как можно приблизить хорошее значение параметра k, чтобы количество кластеров в данных было таким, каким оно должно быть, а не тем, которое я хочу? Другими словами, что, если я не знаю, сколько разрезов мне нужно сделать, потому что я не знаю, сколько кластеров в данных. Это действительно то, что я пытаюсь выяснить, а именно количество кластеров и элементов в каждом кластере. Извините, если я не был ясен раньше. - person dave; 29.06.2011
comment
@dave, можно ли узнать, на какой высоте вы хотите срезать дерево? Если да, используйте параметр h (см. ?cutree). Функция вернет соответствующее количество групп (и принадлежность листьев). - person Roman Luštrik; 29.06.2011
comment
Я вижу, может быть, это то, что я могу сделать, объекты hclust имеют такие компоненты, как матрица слияния, высоты и т. Д., Скажем, если a является объектом hclust, мы можем получить доступ к возможным высотам с помощью $ height. Так что, возможно, выбрав максимальную высоту из этого матрица, я могу узнать количество возможных кластеров. Это то, что я смог найти в процессе чтения. - person dave; 30.06.2011

скажем так,

y<-dist(x)
clust<-hclust(y)
groups<-cutree(clust, k=3)
x<-cbind(x,groups)

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

x1<- subset(x, groups==1)
x2<- subset(x, groups==2)
x3<- subset(x, groups==3)
person user2783711    schedule 16.09.2013