Как создать статистику производительности кластеризации из flexclust?

Попробовав несколько алгоритмов кластеризации, я получил лучшую производительность в своем наборе данных, используя 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?

Ответ 1

Думаю, вы должны использовать

distmat <- distAngle(Nclus, Nclus)

Тем не менее, я не уверен, что это имеет смысл с точки зрения моделирования: для проверки производительности вывода кластеров вы должны использовать метрику, которая более подходит для вашего конкретного случая использования; это может (или не может) быть расстоянием L1:

distmat <- dist(Nclus, "manhattan")

В частности, я предполагаю, что минимизация "угла между наблюдением и центроидом/стандартизованным средним" не совпадает с минимизацией угла внутри кластера между наблюдениями; также я бы предположил, что последнее количество не особенно полезно для целей моделирования. Другими словами, я бы рассматривал distAngle как альтернативный способ ( "трюк" ) для идентификации кластеров k, но затем я бы оценил идентифицированные кластеры другими метриками. Надеюсь, это имеет смысл для вас...