library(RColorBrewer) ## Nearest neighbour classifier nclass <- 4 mu1 <- rnorm(nclass, mean = 0, sd = 10) mu2 <- rnorm(nclass, mean = 0, sd = 10) sigma <- 1 / rchisq(nclass, df = 1) n <- 1000 true.class <- sample(1:nclass, n, replace = TRUE) x <- rnorm(n, mean = mu1[true.class], sd = sigma[true.class]) y <- rnorm(n, mean = mu2[true.class], sd = sigma[true.class]) d <- cbind(x, y) plot(d, col = true.class) ## Number of clusters in model K <- 2 ## Initial guesses m <- d[sample(1:n, K), , drop = FALSE] ## Loop devAskNewPage(TRUE) change <- TRUE old.class <- pred.class <- numeric(n) while(change) { min.dist <- rep(Inf, n) for (k in 1:K) { kdist <- sqrt(colSums((t(d) - m[k,])^2)) pred.class[kdist < min.dist] <- k min.dist <- pmin(min.dist, kdist) } plot(d, col = brewer.pal(8, "Dark2")[pred.class]) points(m, pch = 16) ## update m for (k in 1:K) { m[k,] <- colMeans(d[pred.class == k, , drop = FALSE]) } change <- !identical(old.class, pred.class) old.class <- pred.class } devAskNewPage(FALSE)