Результат kmeans () не меняется от запуска к запуску - PullRequest
0 голосов
/ 25 сентября 2018

enter image description here

Я пытаюсь выполнить несколько прогонов kmeans, чтобы увидеть разные значения, которые totss получают.Но когда я запускаю следующий код, я получаю один и тот же точный результат 50 раз (n = 50).

n= 50
k=1
for (i in c(1:n)){

   set.seed(as.numeric(runif(1))) #random seed

   a <- kmeans(na.omit(data[,c(8,22,23,28)]), centers=2)
   print(a$iter)
   print(a$totss)
   print(a$size)
   print(a$centers)

   k=k+1
   remove(a)
}

Результат

*totss      *size1   *size2

64366.21   14080   13061

64366.21   14080   13061

64366.21   14080   13061

64366.21   14080   13061
...

Есть идеи, почему это происходит?

Изображение: я удалил функцию set.seed () и напечатал a$iter (количество итераций).

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Из данных слишком экстремально, тогда может быть только один оптимальный.

В части данных, которые вы показали, первый столбец является постоянным (= не имеет значения), последнийслишком мала по величине, чтобы иметь значение.И два других имеют только два значения.Так что почти наверняка найдется это тривиальное двоичное разбиение.

Итак, проблема в ваших данных.

0 голосов
/ 26 сентября 2018

set.seed(runif(1)) всегда дает вам set.seed(0).Вместо этого вы можете попробовать set.seed(i).

Вы также можете просто использовать один set.seed вне цикла.


Я изменил runif(1) на runif(1) * 100, новсе равно получал один и тот же вывод для каждого прогона.

Я добавил set.seed(), потому что если я его уроню, цикл даст мне одинаковый результат для всех итераций.

Я понимаю вашу точку зрения, нопроблема в том, что что-то не так, потому что я получаю одинаковые результаты при каждом запуске / итерации.

Кто скажет вам, что kmeans всегда дает случайные результаты?Это зависит от того, как выглядят ваши данные.Следующий пример имеет однозначно два кластера, так что kmeans не будет показывать случайности.

set.seed(0)
X <- rbind(matrix(rnorm(100), 50), matrix(rnorm(100, 10), 50))
plot(X)

## 50 run
cl <- replicate(50, kmeans(X, 2), FALSE)

## size[1]
sapply(cl, "[[", c(7, 1))
# [1] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#[26] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50

## size[2]
sapply(cl, "[[", c(7, 2))
# [1] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
#[26] 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50

## iter
sapply(cl, "[[", 8)
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#[39] 1 1 1 1 1 1 1 1 1 1 1 1

Центры для двух кластеровинвариант, вплоть до маркировки.Иногда нижний левый кластер на рисунке рассматривается как первый кластер, а иногда верхний правый кластер рассматривается как первый кластер.

## center
ctr <- lapply(cl, "[[", 2)
unique(ctr)
#[[1]]
#        [,1]        [,2]
#1 0.02393097  0.02140593    ## lower left cluster is the 1st cluster
#2 9.78910937 10.11978752
#
#[[2]]
#        [,1]        [,2]
#1 9.78910937 10.11978752    ## upper right cluster is the 1st cluster
#2 0.02393097  0.02140593

Если вы хотите увидеть некоторую неопределенность, попробуйте некоторую «неоднозначность»данные:

X <- matrix(runif(200), 100)
plot(X)

Если вы запрашиваете 2 кластера из этого набора данных, kmeans потенциально может давать разные результаты при каждом запуске.Если вы запросите 3 кластера, результат будет более неопределенным.


Примечание

Не сравнивайте totss от запуска к запуску, поскольку он исправлен,Сравните withinss или tot.withinss вместо этого, которые чувствительны к позициям центров.

...