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, wt, wt, wt for
# hidden units to output units.

parms <- c(
   142.65, -416.24, 81.16,
   18.87, -3.11, 51.81,
   -89.74, -38.27, 180.18,
   12.61, -7.68, -40.95,
   1.78, 94.57, -45.50,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   0.0, 0.0, 0.0,
   29.65, 50.19, 0.94, -73.24, 92.44, -80.44, 0.0, 0.0, 0.0);

fit <- nnet.formula(y ~ x1 + x2, data=train, size=8, 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="nnet1.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));

