##
## Classificadoras contínuas
##
rm(list=ls())
##
data(iris)
head(iris)
str(iris)

set.seed(4321)
ind <- sample(1:nrow(iris), 30)
iris.treino <- iris[-ind, ]
iris.teste <- iris[ind, ]

dim(iris)
dim(iris.treino)
dim(iris.teste)

msd.f <- function(x) c(media = mean(x), dp = sd(x))
#with(iris, aggregate(Sepal.Length, list(Species), mean))
#with(iris.treino, tapply(Sepal.Length, Species, msd.f))
#with(iris, aggregate(Sepal.Length, list(Species), msd.f))
#with(iris, aggregate(cbind(Sepal.Length, Sepal.Width), list(Species), msd.f))
#ap <- with(iris.treino, aggregate(cbind(Sepal.Length, Sepal.Width), list(Species), msd.f))
#dim(ap)

#with(iris.treino, tapply(Sepal.Length, Species, msd.f))
#with(iris.treino, tapply(Sepal.Width, Species, msd.f))
#with(iris.treino, tapply(Petal.Length, Species, msd.f))
#with(iris.treino, tapply(Petal.Width, Species, msd.f))

iris.treino.tabs <- list(
    Species =  with(iris.treino, prop.table(table(Species))),
    Sepal.Length = with(iris.treino, aggregate(Sepal.Length, list(Species), msd.f)),
    Sepal.Width = with(iris.treino, aggregate(Sepal.Width, list(Species), msd.f)),
    Petal.Length = with(iris.treino, aggregate(Petal.Length, list(Species), msd.f)),
    Petal.Width = with(iris.treino, aggregate(Petal.Width, list(Species), msd.f))
)
iris.treino.tabs


iris.teste

nbc.f <- function(x, modelo){
    post <- log(modelo$Species)
    vars <- names(x)
    for(i in vars){
        m.sd <- modelo[[i]][[2]]
        post.i <- dnorm(as.numeric(x[i]), m = m.sd[,1], sd = m.sd[,2], log = TRUE)
        post <- post + post.i
    }
    prop.table(exp(post))
}
nbc.f(iris.teste[1, 1:4], modelo = iris.treino.tabs)

(post.probs <- data.frame(probs = t(apply(iris.teste[, 1:4],
                                          1, nbc.f,
                                          modelo = iris.treino.tabs))))
post.probs$predClass <-  apply(post.probs, 1,
                               function(x) substr(names(which.max(x)),
                                                  start = 7, stop = 20)
                               )
post.probs
cbind(post.probs, iris.teste$Species)
table(post.probs$predClass, iris.teste$Species)

##
## Usando um pacote
##
require(e1071)
nBmod <- naiveBayes(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
                    data = iris.treino)
nBmod

nBpred <- as.data.frame(predict(nBmod, iris.teste, type = "raw"))
nBpred <- transform(nBpred,
                    predClass = as.character(predict(nBmod, iris.teste)))
nBpred

nbc.f(iris.teste[1, 1:4], modelo = iris.treino.tabs)
nBpred[1,]
nbc.f(iris.teste[6, 1:4], modelo = iris.treino.tabs)
nBpred[6,]

cbind(post.probs, nBpred)
table(post.probs$predClass, nBpred$predClass)

##
##
##
