#=============================================== # Show the classes as coloured text #=============================================== plot.class <- function(train.data, train.class, test.data, test.class, lim = {}, main = "", ...) { # Display classes as text if (length(lim) == 4) { plot(train.data[,1:2], type = "n", xlim = c(lim[1], lim[2]), ylim = c(lim[3], lim[4]), main = main) } else { plot(train.data[,1:2], type = "n", main = main) } text(train.data[,1], train.data[,2], as.character(train.class), col = train.class+2) if (length(test.class) > 0) { text(test.data[,1], test.data[,2], "*", col = test.class+2, cex = 2) } } plot.class.boundary <- function(train.data, train.class, test.data, test.class, model.exp, predict.exp, numb.xy.pts, lim = {}, extra = 0) { numb.classes <- length(unique(train.class)) model <- eval(model.exp) res <- f.create.grid(train.data, numb.xy.pts, size = lim) xp <- res$xp yp <- res$yp points <- res$zp dimnames(points)[[2]]<- dimnames(train.data)[[2]] Z <- eval(predict.exp) points(points[,1], points[,2], pch = ".", col = (matrix(Z, length(xp), length(yp))+2)) for (c in 1:numb.classes) { contour(xp, yp, matrix(as.numeric(Z == (c - 1)), length(xp), length(yp)), add = T, levels = 0.5, labex = 0, col = 1) } return (model) } example.display <- function(train.data, train.class, test.data, test.class, numb.xy.pts, title, model.exp, predict.exp, lim = {}, extra = {}){ # Plot the data (coloured numbers) plot.class(train.data, train.class, test.data, test.class, lim, main = title) numb.classes <- length(unique(train.class)) model <- plot.class.boundary(train.data, train.class, test.data, test.class, model.exp, predict.exp, numb.xy.pts, lim, extra = extra) cat("===== The model is =====\n") print(model) cat("\n===== Training =====\n") points <- train.data pred.train.class <- eval(predict.exp) print(confusion.expand(pred.train.class, train.class)) # Print the total number of incorrect classifications misclass.train.ind <- which(pred.train.class!=train.class) cat("\n===== Misclassified training cases =====\n") if (length(misclass.train.ind) > 0) { tmp <- rbind(train.data[misclass.train.ind,]) rownames(tmp) <- misclass.train.ind # Print the incorrect classes print(tmp) # Display the incorrect classes in blue points(tmp, col = "blue", pch = 24) } else { cat("No misclassified cases\n") } if (length(test.data) > 0) { cat("\n===== Test =====\n") points <- test.data pred.test.class <- eval(predict.exp) ind.tmp <- ((points-1) != test.class)*(1:length(test.class)) print(confusion.expand(pred.test.class, test.class)) misclass.test.ind <- which(pred.test.class != test.class) cat("\n===== Misclassified test cases =====\n") if (length(misclass.test.ind) > 0) { tmp <- rbind(test.data[misclass.test.ind,]) rownames(tmp) <- misclass.test.ind # Print the incorrect classes print(tmp) # Display the incorrect classes in blue points(tmp, col = "blue", pch = 25) } else { cat("No misclassified cases\n") } } cat("===================================\n\n") bringToTop(which = dev.cur(), stay = FALSE) model }