LVQ

O algoritmo de quantização de vetores de aprendizagem (LVQ) é um algoritmo de rede neural artificial que permite escolher quantas instâncias de treinamento você deseja trabalhar e aprende exatamente como elas devem ser.

Preparando os dados

Aqui nós criamos um dataframe com dez mil frutas e uma condição para definir a bandeira ‘flag’ de cada fruta.

library(class)
library(e1071)
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
set.seed(88)
n = 10000
a = sample(1:20, n, replace = T)
b = sample(20:45, n, replace = T)
f = ifelse(a > 9 & b > 30, "cítrica", 
           ifelse(a < 4 | b < 11, "seca", "vermelha"))

df = data.frame(a = a, b = b, flag = as.factor(f))
head(df)
##    a  b     flag
## 1 13 43  cítrica
## 2  7 24 vermelha
## 3 19 26 vermelha
## 4  2 45     seca
## 5 17 36  cítrica
## 6 16 38  cítrica

Dividindo os dados em conjunto de treino e teste

Para esta divisão criamos um vetor ‘amostra’ com ‘1’ e ‘2’, em que a probabilidade de aparecer ‘1’ é de 70% e ‘2’ é de 30%. Em seguida criamos o arquivo de treino e o arquivo de teste.

set.seed(88)
amostra <- sample(2,n,replace = T,prob = c(0.7,0.3))
treino_d <- df[amostra==1,]
teste_d <- df[amostra==2,]

Convertendo os dataframes divididos em matrizes

treino = data.matrix(treino_d[, c("a","b")])
teste = data.matrix(teste_d[, c("a","b")])
 
treino_label = factor(treino_d[, "flag"])
teste_label = teste_d$flag

Construíndo um codebook para o LVQ

codeBook = lvqinit(treino, treino_label, size = 100)

olvq1() representa o conjunto de treinamento em um codebook

buildCodeBook = olvq1(treino, treino_label, codeBook)

Predição

predict = lvqtest(buildCodeBook, teste)

Criando a Matriz de confusão para verificar a acurácia da predição

confusionMatrix(teste_label, predict)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction cítrica seca vermelha
##   cítrica      989    0       11
##   seca           0  440        0
##   vermelha      15    3     1536
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9903          
##                  95% CI : (0.9861, 0.9935)
##     No Information Rate : 0.5167          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9838          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: cítrica Class: seca Class: vermelha
## Sensitivity                  0.9851      0.9932          0.9929
## Specificity                  0.9945      1.0000          0.9876
## Pos Pred Value               0.9890      1.0000          0.9884
## Neg Pred Value               0.9925      0.9988          0.9924
## Prevalence                   0.3353      0.1480          0.5167
## Detection Rate               0.3303      0.1470          0.5130
## Detection Prevalence         0.3340      0.1470          0.5190
## Balanced Accuracy            0.9898      0.9966          0.9902

Observação na Matriz de confusão

Em relação às frutas cítricas, o algoritmo acertou 989 e errou 15, informando que 15 seriam vermelhas, quando na verdade eram cítricas. Quanto às frutas secas, acertou 440 e errou 3. Já quanto às frutas vermelhas, o algoritmo acertou 1536 e errou 11.