Попробовав несколько алгоритмов кластеризации, я получил лучшую производительность в своем наборе данных, используя flexclust::kcca
с family = kccaFamily("angle")
.
Здесь приведен пример использования набора данных Nclus
из flexclust
.
library(fpc)
library(flexclust)
data(Nclus)
k <- 4
family <- flexclust::kccaFamily("angle")
model <- flexclust::kcca(Nclus, k, family)
Теперь я хочу оптимизировать количество кластеров. Наиболее полный набор показателей производительности для моделей кластера, по-видимому, найден с помощью fpc::cluster.stats
. Эта функция требует двух входных данных: матрицы расстояния и кластеров, которые были назначены.
Последнее легко; это просто [email protected]
.
Я борюсь за то, что нужно предоставить матрице расстояний. kcca
не возвращает объект расстояния (или если это так, я его не нашел).
Я предполагаю, что обычно я использовал бы dist(Nclus)
. В этом случае я не хочу, чтобы евклидово расстояние (или любой другой метод, доступный dist
) – Мне нужна дистанционная мера, используемая алгоритмом кластеризации. Я могу воссоздать матрицу расстояний, используемую kcca
, используя код из этой функции.
control <- as(list(), "flexclustControl")
centers <- flexclust:::initCenters(Nclus, k, family, control)
distmat <- distAngle(Nclus, centers$centers)
Тогда я должен просто вычислить статистику модели кластера, используя
fpc::cluster.stats(distmat, [email protected])
Проблема в том, что я даю мне два предупреждения о аргументе расстояния.
Warning messages:
1: In as.dist.default(d) : non-square matrix
2: In as.matrix.dist(d) :
number of items to replace is not a multiple of replacement length
Это заставляет меня подозревать, что я делаю это неправильно.
Как передать матрицу расстояний в cluster.stats
?