#---------------------------------------------------------------#
library(lhs)
##
set.seed(11)
n <- 300 # num observaciones
k <- 4 # num features
X_ <- optimumLHS(n, k) # dist máx LHS uniforme
X <- matrix(0,nrow = n, ncol = k ) # para recibir al transformador
X[,1] <- qnorm(X_[,1]) # Transformada gaussiana
X[,2] <- qexp(X_[,2]) # exponencial
X[,3] <- qpois(X_[,3],lambda = 1) # poisson
X[,4] <- X_[,4] # sin cambios (uniforme)

require(ggplot2)
require(GGally)
df <- data.frame(X)
names(df) <- c("X1_Norm", "X2_Exp", "X3_Pois_1", "X4_unif")
p1 <- ggpairs(df[,c(1,2,3,4)], # elección de variables
              alfa = 1/2) # transparencia

p1<- p1 + theme(panel.background = # ¡es más bonito!
                  element_rect(color = "rosa"))

p1<- p1 + theme(text=element_text(size=14)) # tamaño caracteres
p1 # pantalla
#---------------------------------------------------------------#
require(caret)

set.seed(1)                   
y <- 10*df[,1] +                      # una función desconocida
     7* df[,2] * rnorm(nrow(df))+ 
     3*sin(df[,3])+
     2*sin(df[,4])*runif(nrow(df))
y <-  ifelse(y < 7,0,1)               # fabricación de clases 
sum(y)/length(y)                      # verif % clases
          
df_<- data.frame(df,y)                # más sencillo para:
p          <- createDataPartition(y=df_$y,
                                  p= 50/100,
                                  list=FALSE)
training   <- df_[p,]  
test       <- df_[-p,]
#---------------------------------------------------------------#
library(neuralnet)
m.training <- apply(as.matrix(training),c(1,2),as.numeric)

# ejemplo de función membership                               ## 

nn <- neuralnet(y~ X1_Norm + X2_Exp + X3_Pois_1 + X4_unif , 
                m.training, 
                hidden=c(3,3),
                act.fct="tanh")
nn

m.test <- apply(as.matrix(test),c(1,2),as.numeric)

p <- compute(nn,m.test[,1:4])
b <- p$net.result
a <- m.training[,"y"]        # inútil aquí pero para recordar
c <-(max(a)-min(a))*b+min(a) # que resultados en proporción
                             # hay que renormalizar

hyperparam <- 0.5            # JUGAR con este valor
y.pred <- ifelse(c < hyperparam, 0,1)
y.test <- test$y
confusionMatrix(y.test,y.pred)  # test

plot(nn)                     # ver su neural network

#---------------------------------------------------------------#
