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
вместо этого, которые чувствительны к позициям центров.