Кластеризация нечетких C-средних в R - PullRequest
0 голосов
/ 13 ноября 2018

Я выполняю нечеткую кластеризацию для некоторых данных. Сначала я масштабировал фрейм данных, чтобы у каждой переменной было среднее значение 0 и sd 1. Затем я запустил функцию clValid из пакета clValid следующим образом:

library(dplyr)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
intvalid <- clValid(clust, 2:10, clMethods=c("fanny"),
                validation="internal", maxitems = 1000)

Результаты показали, что 4 будет лучшим числом кластеров. Поэтому я запустил функцию fanny из пакета cluster следующим образом:

res.fanny <- fanny(clust, 4, metric='SqEuclidean')
res.fanny$coeff
res.fanny$k.crisp
df$fuzzy<-res.fanny$clustering
profile<-ddply(df,.(fuzzy),summarize,
           count=length(fuzzy))

Однако, глядя на profile, у меня есть только 3 кластера вместо 4. Как это возможно? Должен ли я пойти с 3 кластерами, чем вместо 4? Как мне это объяснить? Я не знаю, как заново создать мои данные, потому что они довольно большие. Как кто-нибудь еще сталкивался с этим раньше?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

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

Проблема, описанная спрашивающим, может быть воссоздана путем увеличения параметра memb.exp с использованием набора данных радужной оболочки.Вот пример:

library(plyr)
library(clValid)
library(cluster)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)

res.fanny <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 2) 

Вызов res.fanny$k.crisp показывает, что это производит 4 четких кластера.

res.fanny14 <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 14)

Вызов res.fanny14$k.crisp показывает, что это производит 3 четких кластера.

Можно по-прежнему получить доступ к членству в каждом из 4 кластеров, используя res.fanny14$membership.

Если у вас есть веские основания полагать, что должно быть 4 четких кластера, можно уменьшить параметр memb.exp.Что бы ужесточить кластерные назначения.Или, если вы выполняете какое-то контролируемое обучение, одна процедура для настройки этого параметра будет состоять в том, чтобы зарезервировать некоторые тестовые данные, выполнить поиск в сетке гиперпараметров, а затем выбрать значение, которое дает наилучший результат в выбранной вами метрике.Однако, не зная больше о задаче, данных или о том, что спрашивающий пытается выполнить, трудно предложить гораздо больше.

0 голосов
/ 20 ноября 2018

Прежде всего, я рекомендую прочитать красивую виньетку из пакета 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
...