library(nnet);

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

# Order is bias, wt, wt for input units to hidden units
# followed by bias, wt, wt, wt, wt, wt for hidden units
# to output units.

parms <- c(
   23.896678, -62.450621,  11.170289,  
   -3.845333,  -6.110258,  42.139228, 
   -13.430940, -10.640723,  27.986805,  
   21.322889, -10.303906, -77.733978,  
   9.222935,  37.111371, -31.209375,  
   12.395668,  33.377473, -15.457109, -19.592486,  51.958010, -28.515135);

fit <- nnet.formula(y ~ x1 + x2, data=train, size=5, maxit=500, Wts=parms);

print(fit)
print.summary.nnet(fit)

size <- 100;

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

Grid <- data.frame(x1=grid[,1],x2=grid[,2]);

dflt <- predict.nnet(object=fit,newdat=Grid);
dflt <- (dflt > 0.5);

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]  ) ;
}
}

X <- cbind(train$x1,train$x2);
y <- (train$y==1);

source("psopts.r");
postscript(file="nnet0.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();

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

dflt <- predict.nnet(object=fit,newdat=test);
dflt <- (dflt > 0.5);

dflt <- as.numeric(dflt);
ty <- test$y;

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

