Прежде всего, я рекомендую прочитать красивую виньетку из пакета clValid .Пакет R clValid
содержит функции для проверки результатов кластерного анализа.Существует три основных типа доступных методов проверки кластера.Одной из таких мер является индекс Данна, отношение между наблюдениями не в одном кластере к большему расстоянию внутри кластера.Я сосредотачиваюсь на индексе Данна для простоты.В общем, связность должна быть минимизирована, в то время как индекс Данна и ширина силуэта должны быть максимизированы.Создатели clValid
явно ссылаются на функцию fanny
пакета cluster
в своей документации.
Пакет clValid
полезен для запуска нескольких алгоритмов / метрик в заранее заданных наборах кластеризации.
library(dplyr)
library(clValid)
iris
table(iris$Species)
clust <- sapply(iris[, -5], scale)
В моем коде мне нужно увеличить итерацию для достижения сходимости (maxit = 1500).Результаты получены с помощью функции итога, примененной к объекту clValid intvalid.Кажется, что оптимальное количество кластеров составляет 2 (но здесь это не главное).
intvalid <- clValid(clust, 2:5, clMethods=c("fanny"),
maxit = 1500,
validation="internal",
metric="euclidean")
summary(intvalid)
Результаты любого метода могут быть извлечены из объекта clValid
для дальнейшего анализа с использованием метода clusters
.Здесь извлекаются результаты из решения 2 кластеров (hc$
2) с акцентом на коэффициент Даннетта (hc$
2 $coeff
).Конечно, эти результаты были связаны с «евклидовой» метрикой вызова clValid
.
hc <- clusters(intvalid, "fanny")
hc$`2`$coeff
Теперь я просто вызываю fanny
из пакета cluster
, используя евклидову метрику и 2 кластера.Результаты полностью совпадают с предыдущим шагом.
res.fanny <- fanny(clust, 2, metric='euclidean', maxit = 1500)
res.fanny$coeff
Теперь мы можем взглянуть на таблицу классификации
table(hc$`2`$clustering, iris[,5])
setosa versicolor virginica
1 50 0 0
2 0 50 50
и на profile
df$fuzzy <- hc$`2`$clustering
profile <- ddply(df,.(fuzzy), summarize,
count=length(fuzzy))
profile
fuzzy count
1 1 50
2 2 100