library(geometry) perceptron.load.data <- function(filename) { lines <- sapply(readLines(filename), function(x) strsplit(x, " ")) data.points <- list() data.labels <- c() for(i in 1:(length(lines))) { data.points[[i]] <- as.double(lines[[i]][1:3]) data.labels[i] <- as.integer(lines[[i]][4]) } data <- list(data.points, data.labels) names(data) <- c("point", "label") return(data) } perceptron.learn <- function(data.points, data.labels, weight) { repeat { L <- 0 for(i in 1:length(data.labels)) { delta <- data.labels[i] - sign(dot(data.points[[i]], weight)) if(delta != 0) { L <- L + 1 weight <- weight + delta * data.points[[i]] } } if(L == 0) { break } } return(function(x) sign(dot(x, weight))) }