### nnet - biblioteca básica de R -- NeuralNetTools - r

library (nnet)                                   # distribuida con R básico

entrena <- sample (nrow(iris), nrow(iris)/2)               # individuos para entrenar la red
red <- nnet (Species~., iris[entrena,], size=0, skip=TRUE) # perceptrón simple
#red <- nnet (Species~., iris[entrena,], size=3)           # una capa oculta con tres neuronas

summary (red)                         # pesos
library (NeuralNetTools)              # requiere install.packages("NeuralNetTools")
plotnet (red)                         # requiere NeuralNetTools

predict (red, iris[-entrena,])         # probabilidades; requiere nnet
predict (red, iris[-entrena,], type="class") -> predicciones

matriz <- table (iris[-entrena,"Species"], predicciones) # matriz de confusión
prop.table (matriz, 1)                                   # % errores por especie

plot (Petal.Width ~ Petal.Length, iris[-entrena,], col = Species)   # tres especies
plot (Petal.Width ~ Petal.Length, iris[-entrena,], col = (Species!=predicciones)+1, pch=16)   # errores en rojo

## importancia de variables explicativas
red <- nnet (Species~., iris[entrena,], size=3) # garson y olden dan error con perceptrones simples
garson(red) # error por no binario
olden(red)  # puede variar mucho

### neuralnet - varias capas ocultas

library (neuralnet)                            # requiere install.packages("neuralnet")

entrena <- sample (nrow(mtcars), nrow(mtcars)/2)
red <- neuralnet (mpg+am+vs~wt+qsec+hp, mtcars[entrena,], hidden=0)      # perceptrón simple
red <- neuralnet (mpg+am+vs~wt+qsec+hp, mtcars[entrena,], hidden=2)      # una capa oculta de 2 neuronas
red <- neuralnet (mpg+am+vs~wt+qsec+hp, mtcars[entrena,], hidden=c(3,2)) # dos capa ocultas de 3 y 2 neuronas
plot (red)
compute (red, mtcars[-entrena, c("wt","qsec","hp")])    # predicciones (para binarias, umbral=0.5)
predict (red, mtcars[-entrena, c("wt","qsec","hp")])    # idem
predict (red, mtcars[-entrena,])                        # idem

### RSNNS - redes de funciones de base radial

library ("RSNNS")                              # requiere install.packages("RSNNS")
irisbar   <- iris[sample(nrow(iris)),]         # iris barajado
dfValues  <- irisbar[,1:4]
dfTargets <- decodeClassLabels (irisbar[,5])      # crea variables binarias
df <- splitForTrainingAndTest (dfValues, dfTargets, ratio=0.15)
df <- normTrainingAndTestSet (df)              # tipifica
red <- mlp (df$inputsTrain, df$targetsTrain,   # perceptrón multicapa
            size = c (4, 3))                   # neuronas en capas ocultas
red <- rbf (df$inputsTrain, df$targetsTrain,   # red radial
            size = 4)                          # neuronas en capa oculta (5 por omisión)
red <- rbfDDA(df$inputsTrain, df$targetsTrain) # red radial con ajuste dinámico
## rbfDDA sólo puede clasificar; empieza sin capas ocultas y las va añadiendo
predicciones <- predict (red, df$inputsTest)
confusionMatrix (df$targetsTrain, fitted (red))
confusionMatrix (df$targetsTest,  predicciones)
red
weightMatrix (red)                    # pesos
summary (red)                         # información adicional
extractNetInfo (red)                  # (coeficientes, arquitectura...)