R Language
Иерархическая кластеризация с hclust
Поиск…
Вступление
Пакет stats
предоставляет функцию hclust
для выполнения иерархической кластеризации.
замечания
Помимо hclust, доступны другие методы, см. Представление пакета CRAN для кластеризации .
Пример 1 - Основное использование hclust, отображение дендрограммы, кластеры сюжетов
Библиотека кластера содержит данные ruspini - стандартный набор данных для иллюстрации кластерного анализа.
library(cluster) ## to get the ruspini data
plot(ruspini, asp=1, pch=20) ## take a look at the data
hclust ожидает матрицу расстояния, а не исходные данные. Мы вычисляем дерево, используя параметры по умолчанию и отображаем его. Параметр зависания выравнивает все листья дерева вдоль базовой линии.
ruspini_hc_defaults <- hclust(dist(ruspini))
dend <- as.dendrogram(ruspini_hc_defaults)
if(!require(dendextend)) install.packages("dendextend"); library(dendextend)
dend <- color_branches(dend, k = 4)
plot(dend)
Вырежьте дерево, чтобы дать четыре кластера и поменять данные, окрашивающие точки кластером. k - желаемое количество кластеров.
rhc_def_4 = cutree(ruspini_hc_defaults,k=4)
plot(ruspini, pch=20, asp=1, col=rhc_def_4)
Эта кластеризация немного странная. Мы можем получить лучшую кластеризацию, сначала масштабируя данные.
scaled_ruspini_hc_defaults = hclust(dist(scale(ruspini)))
srhc_def_4 = cutree(scaled_ruspini_hc_defaults,4)
plot(ruspini, pch=20, asp=1, col=srhc_def_4)
Показатель разницы по умолчанию для сравнения кластеров «завершен». Вы можете указать другую меру с помощью параметра метода.
ruspini_hc_single = hclust(dist(ruspini), method="single")
Пример 2 - hclust и outliers
С иерархической кластеризацией выбросы часто отображаются как одноточечные кластеры.
Сгенерируйте три гауссовских распределения, чтобы проиллюстрировать эффект выбросов.
set.seed(656)
x = c(rnorm(150, 0, 1), rnorm(150,9,1), rnorm(150,4.5,1))
y = c(rnorm(150, 0, 1), rnorm(150,0,1), rnorm(150,5,1))
XYdf = data.frame(x,y)
plot(XYdf, pch=20)
Создайте структуру кластера, разделите его на три кластера.
XY_sing = hclust(dist(XYdf), method="single")
XYs3 = cutree(XY_sing,k=3)
table(XYs3)
XYs3
1 2 3
448 1 1
hclust обнаружил два выброса и поместил все остальное в один большой кластер. Чтобы получить «реальные» кластеры, вам может потребоваться установить k выше.
XYs6 = cutree(XY_sing,k=6)
table(XYs6)
XYs6
1 2 3 4 5 6
148 150 1 149 1 1
plot(XYdf, pch=20, col=XYs6)
В этой статье StackOverflow есть некоторые рекомендации о том, как выбрать количество кластеров, но помните об этом поведении в иерархической кластеризации.