Проверка нечеткой кластеризации - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы использовать нечеткую кластеризацию C-средних на большом неконтролируемом наборе данных из 41 переменной и 415 наблюдений. Тем не менее, я застрял при попытке проверить эти кластеры. Когда я строю график со случайным числом кластеров, я могу объяснить в общей сложности 54% дисперсии, что не очень хорошо, и нет действительно хороших кластеров, как это было бы с базой данных iris, например.

Сначала я запустил fcm со своими данными весов на 3 кластерах, чтобы увидеть, но если я пытаюсь найти способ поиска оптимального количества кластеров, то я не хочу устанавливать произвольно определенное количество кластеры.

Так что я повернулся к Google и погуглил: "нечеткая кластеризация в R." Эта ссылка здесь была хороша , но мне все еще нужно попробовать кучу разного количества кластеров. Я посмотрел на пакеты advclust, ppclust и clvalid, но не смог найти пошаговое руководство по функциям. Я посмотрел на документацию каждого пакета, но также не мог понять, что делать дальше.

Я прошел через некоторое возможное количество кластеров и проверил каждый с помощью объекта k.crisp от fanny. Я начал с 100 и опустился до 4. На основании описания объекта в документации,

k.crisp = целое число (≤ k), дающее число четких кластеров; может быть меньше чем k, где рекомендуется уменьшать memb.exp.

это не похоже на правильный способ, потому что он сравнивает количество четких кластеров с нашими нечеткими кластерами.

Есть ли функция, в которой я могу проверить действительность моих кластеров из 2:10 кластеров? Также стоит ли проверять валидность 1 кластера? Я думаю, что это глупый вопрос, но у меня странное чувство, что я могу получить 1 оптимальный кластер. (Какие-нибудь советы, что делать, если я должен был получить 1 кластер, кроме того, чтобы немного поплакать изнутри?)

Код

library(cluster)
library(factoextra)
library(ppclust)
library(advclust)
library(clValid)
data(iris)
df<-sapply(iris[-5],scale)
res.fanny<-fanny(df,3,metric='SqEuclidean')
res.fanny$k.crisp
# When I try to use euclidean, I get the warning all memberships are very close to 1/l. Maybe increase memb.exp, which I don't fully understand
# From my understanding using the SqEuclidean is equivalent to Fuzzy C-means, use the website below. Ultimately I do want to use C-means, hence I use the SqEuclidean distance
fviz_cluster(Res.fanny,ellipse.type='norm',palette='jco',ggtheme=theme_minimal(),legend='right')
fviz_silhouette(res.fanny,palette='jco',ggtheme=theme_minimal())

# With ppclust
set.seed(123)
res.fcm<-fcm(df,centers=3,nstart=10)

веб-сайт, как указано выше .

1 Ответ

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

Насколько я знаю, вам нужно пройти через разное количество кластеров и посмотреть, как объясняется процент дисперсии с разным количеством кластеров. Этот метод называется методом локтя.

wss <- sapply(2:10, 
       function(k){fcm(df,centers=k,nstart=10)$sumsqrs$tot.within.ss})

plot(2:10, wss,
     type="b", pch = 19, frame = FALSE, 
     xlab="Number of clusters K",
     ylab="Total within-clusters sum of squares")

Полученный участок

wss-number of clusters

После k = 5 общая сумма квадратов в кластере имеет тенденцию к медленному изменению. Таким образом, k = 5 является хорошим кандидатом на то, чтобы быть оптимальным числом кластеров в соответствии с методом локтя.

...