train <- read.table("loans.dat",header=F,col.names=c("x1","x2","y"));

X <- cbind(train$x1,train$x2);
y <- as.factor(train$y);

size <- 100;
grid <- mat.or.vec((size+1)*(size+1),2);
for (i in 0:size) {
for (j in 0:size) {
  grid[(size+1)*j+i+1,1] <- i;
  grid[(size+1)*j+i+1,2] <- j;
}
}
grid <- grid/(size+1);

library(class);

dflt <- knn(train=X,test=grid,cl=y,k=15);

dflt <- (dflt==1);
y    <- (y==1);

edge <- mat.or.vec((size+1)*(size+1),1);
edge <- as.logical(edge);
for (i in 1:size) {
for (j in 1:size) {
  left <- (size+1)*j+i+1;
  rite <- (size+1)*(j-1)+i+1;
  top  <- left;
  bot  <- left - 1;
  edge[left] <- 
    ( dflt[left] && !dflt[rite] ) ||
    ( !dflt[left] && dflt[rite] ) ||
    ( dflt[top]  && !dflt[bot]  ) || 
    ( !dflt[top]  && dflt[bot]  ) ;
}
}

source("psopts.r");
postscript(file="near15.eps");

plot(X,type='n',xlab="FICO Score",ylab="P-Index");
points(X[y,],pch='o',col="red");
points(X[!y,],pch='o',col="green");
points(grid[dflt,],pch='.',col="red");
points(grid[!dflt,],pch='.',col="green");
points(grid[edge,],pch='+',col="black",cex=0.4);

dev.off();

y <- as.factor(train$y);

test <- read.table("eval.dat",header=F,col.names=c("x1","x2","y"));

tX <- cbind(test$x1,test$x2);
ty <- test$y;

dflt <- knn(train=X,test=tX,cl=y,k=15);

dflt <- as.numeric((dflt==1));

err <- abs(ty-dflt);
print(mean(err));

