library(nnet)
library(class)
x <- read.table("../data/phoneme.data",header=T,sep=",")
x <- read.table("https://www.uio.no/studier/emner/matnat/math/STK2100/data/phoneme.data",header=T,sep=",")
#remove row.names
head(x[,c(1:3,256:258)])
x = x[,-1]
x$g = as.factor(x$g)

#Only considering aa and a0
#x2 = x[(x$g=="aa") |(x$g=="ao"),]
#x2$g = droplevels(x2$g)
x2 = x
n <- nrow(x2)
set.seed(123)
train <- sample(1:n,as.integer(0.5*n),replace=FALSE)
test <- c(1:n)[-train]
n.train = length(train)
n.test = length(test)

cl = c("aa","ao","dcl","iy","sh")

library(nnet)
fit.multinom = multinom(g ~ .-speaker, data = x2[train,],MaxNWts=1500)
pred.multinom = predict(fit.multinom,newdata=x2[test,])
table(x2$g[test],pred.multinom)
cat("Error rate multinom=",sum(x2$g[test]!=pred.multinom)/n.test,"\n")


#Testing with a few input variables
fit.nnet <- nnet(g ~ x.1+x.2+x.3+x.4+x.5+x.6+x.7+x.8+x.9+x.10, 
                 data = x2[train,], size=4, 
                 maxit=300, decay=0.01, trace=FALSE)
library(devtools)
source_url('https://gist.githubusercontent.com/Peque/41a9e20d6687f2f3108d/raw/85e14f3a292e126f1454864427e3a189c2fe33f3/nnet_plot_update.r')
#pdf("../fig/nnet_phoneme.pdf",height=8,width=12)
plot(fit.nnet)
#dev.off()
prob.nnet = predict(fit.nnet,newdata=x2[test,])
pred.nnet = cl[apply(prob.nnet,1,which.max)]  
table(x2$g[test],pred.nnet)
cat("Error rate nnet=",sum(x2$g[test]!=pred.nnet)/n.test,"\n")

set.seed(123)
#fit.nnet <- nnet(g ~ .-speaker, data = x2[train,], size=4, 
#                 maxit=300, decay=0.01, trace=FALSE)
fit.nnet <- nnet(g ~ .-speaker, data = x2[train,], size=10, 
                 maxit=300, MaxNWts=3000,decay=0.0001, trace=FALSE)
prob.nnet = predict(fit.nnet,newdata=x2[test,])
cl = c("aa","ao","dcl","iy","sh")
pred.nnet = cl[apply(prob.nnet,1,which.max)]  
table(x2$g[test],pred.nnet)
cat("Error rate nnet=",sum(x2$g[test]!=pred.nnet)/n.test,"\n")

fit.nnet <- nnet(g ~ .-speaker, data = x2[train,], size=20, 
                 maxit=300, MaxNWts=6000,decay=0.001, trace=FALSE)
pred.nnet = as.numeric(predict(fit.nnet,newdata=x2[test,])>0.5)
pred.nnet = cl[pred.nnet+1]
table(x2$g[test],pred.nnet)
cat("Error rate nnet=",sum(x2$g[test]!=pred.nnet)/n.test,"\n")
Err[11,1]  = sum(x2$g[test]!=pred.nnet)/n.test

rownames(Err) = c("bic","lda","qda","knn","gam","gam2","tree","tree2","nnet","nnet2","nnet3")

fit.neural <- neuralnet(g ~ x.1+x.2, data = x2[train,], hidden=c(4,4))


