2014-05-17 3 views
0

Я знаю, что этот вопрос уже задавался, но я не в состоянии реализовать достойный сюжет для следующего кода:Как найти оптимальное количество кластеров?

options(digits=1) 
set.seed(2014) 

mydata <- matrix(seq(1,360),nrow=10,ncol=36) 
wss <- c() 
for (i in 1:19) wss[i] <- sum(kmeans(x=mydata,centers=seq(1,360,length.out=20)[i])$withinss) 
plot(1:9, wss, type="b", xlab="Number of Clusters", 
    ylab="Within groups sum of squares") 

Это производит следующее сообщение об ошибке

Error in sample.int(m, k) : 
cannot take a sample larger than the population when 'replace = FALSE' 
+0

Попробуйте с помощью 'mydata <- matrix (runif (720), ncol = 2)'. – jbaums

+0

Похоже, у вас есть опечатка: замените 'for (i in 1:19)' на 'for (i in 1: 9)'. Aso, центры - это * число кластерных центров * (следовательно, число кластеров), поэтому замените 'центры = seq (...)' на 'центры = i'. – jlhoward

+0

@jlhoward мое намерение состояло в том, чтобы сделать случайное распределение «центров», используя строку 'seq (1,360, length.out = 20) [i]' – Franckess

ответ

0

Немного искры в темноте!

options(digits=1) 
set.seed(2014) 

mydata <- seq(from=1,to=365) 
wss <- c() 
for (i in 5:15){ 
wss[i-4] <- sum(kmeans(mydata,centers=floor(seq(from=1,to=365,length.out=i)[-i]))$withinss) 
} 
plot(1:15,wss,type="b",xlab="Number of Clusters",ylab="Within groups sum of squares") 

Имеет ли это значение? @jlhoward @ jbaums

3

kmeans предполагает, что каждая строка ваши данные являются наблюдением. Так что если у вас есть k строк в x, результаты $clusters будут иметь длину k. Здесь ваши тестовые данные имеют 10 строк. Однако вы указываете centers=20, когда i=2 Нет никакого способа, чтобы 10 наблюдений могли иметь 20 разных кластеров.

Смежные вопросы