Построение итераций k-средних в R - PullRequest
0 голосов
/ 28 августа 2018

Я нашел этот код из Rentrop в ответе на другой вопрос о построении k-средних, но мне было интересно, почему это только отображает две итерации для любого данного набора данных. Есть ли способ обобщить его, чтобы остановить построение графика, когда он сходится, вместо того, чтобы просто остановиться после двух итераций?

set.seed(1337)
df = iris[,1:2]


dfCluster<-kmeans(df,centers=3, iter.max = 1)
  plot(df[,1], df[,2], col=dfCluster$cluster,pch=19,cex=2, main="iter 1")
  points(dfCluster$centers,col=1:5,pch=3,cex=3,lwd=3)

max_iter = 10

for (i in 2:max_iter){
  tryCatch({
    dfCluster <- kmeans(df,centers = dfCluster$centers, iter.max = 1)
    done <- TRUE
  }, 
  warning=function(w) {done <- FALSE})
  plot(df[,1], df[,2], col=dfCluster$cluster,pch=19,cex=2, main=paste("iter",i))
  points(dfCluster$centers,col=1:5,pch=3,cex=3,lwd=3)
  if(done) break
}

1 Ответ

0 голосов
/ 29 августа 2018

Если вы просто хотите как можно меньше изменить существующий код, измените значение ИСТИНА / ЛОЖЬ на tryCatch:

tryCatch({
dfCluster <- kmeans(df,centers = dfCluster$centers, iter.max = 1)
done <- FALSE #was TRUE
}, 
warning=function(w) {done <- TRUE}) #was FALSE

Тем не менее, этот код отображает сколько угодно графиков в max_iter независимо от того, сходится ли kmeans за 2 итерации или 20. Вот мое переписывание:

# data
set.seed(1234)
df = iris[ , 1:2]

# functions for plotting
myplot <- function(out, i) {
    plot(df[,1], df[,2], pch=20, main=paste("iter",i),
         col=scales::alpha(out$cluster, "0.5"))
}

mypoints <- function(out) {
    points(out$centers, col=1:3, pch=3, cex=2, lwd=3)
}

# number of plots = min(user-specified iters, iters until convergence)
actual_iters <- kmeans(df, centers=3)$iter
max_iter = 10
N <- min(max_iter, actual_iters)

# initial kmeans
out <- kmeans(df, centers=3, iter.max=1)
myplot(out,1)
mypoints(out)

# loop through next iters of kmeans
for (i in 2:N){
    out <- kmeans(df, centers=out$centers, iter.max=1)
    myplot(out,i)
    mypoints(out)
}
...