Se formos ao dicionário online dictionary.com teremos as seguintes definições sobre Inteligência Artificial (AI):
Utilizando estes conceitos como referência, podemos dizer que Inteligência Artificial (AI) é uma tentativa de tornar os computadores tão inteligentes, ou até mais inteligentes que os seres humanos. Trata-se de dar aos computadores comportamentos semelhantes aos humanos, processos de pensamento e habilidades de raciocínio.
Citando reitor interino da School of Computer Science da CMU, Professor e Ex-Presidente do Departamento de Machine Learning da Carnegie Mellon University, Tom M. Mitchell:
“Um campo científico é mais bem definido pela questão central que estuda. A área de Machine Learning (ML) busca responder à pergunta: Como podemos construir sistemas de computadores que melhoram automaticamente com a experiência, e o que são as leis fundamentais que regem todos os processos de aprendizagem?”
Podemos afirmar que AI é uma tecnologia com a qual podemos criar sistemas inteligentes que podem simular a inteligência humana. Já Machine Learning ou ML é um subcampo da AI, que tem seu foco no aprendizado de máquinas de tal forma que as máquinas aprendam com dados ou experiências anteriores sem serem explicitamente programadas.
A análise discriminante linear é uma técnica de aprendizado de máquina bem estabelecida e um método de classificação para prever categorias. Suas principais vantagens, em comparação com outros algoritmos de classificação, como redes neurais e florestas aleatórias, são que o modelo é interpretável e que a previsão é fácil. A análise discriminante é frequentemente usada como uma técnica de redução de dimensionalidade para reconhecimento ou classificação de padrões e aprendizado de máquina.
A análise discriminante usa um conjunto de dados de casos, também conhecido como observações, como entrada. Para cada caso, você precisa ter uma variável categórica para definir a classe e várias variáveis preditoras, que são numéricas. Muitas vezes visualizamos esses dados de entrada como uma matriz, como mostrado abaixo, com cada caso sendo uma linha e cada variável uma coluna. Neste exemplo, a variável categórica é chamada de classe e as variáveis preditivas, que são numéricas, são as outras colunas.
Este exemplo, discutido abaixo, refere-se a classes de veículos motorizados com base em imagens desses veículos. Pense em cada caso como um ponto no espaço \(p\)-dimensional, onde \(p\) é o número de variáveis preditoras. Cada ponto é rotulado por sua categoria.
O algoritmo discriminante usa esses dados para dividir o espaço de variáveis preditoras em regiões. As regiões são rotuladas por categorias e possuem limites lineares. O modelo prevê a categoria de um novo caso não visto de acordo com a região em que se encontra. O modelo prevê que todos os casos dentro de uma região pertencem à mesma categoria.
Os limites lineares são consequência da suposição de que as variáveis preditoras para cada categoria possuem a mesma distribuição gaussiana multivariada. Embora, na prática, essa suposição possa não ser 100% verdadeira, se for aproximadamente válida, a análise discriminante linear ainda pode ter um bom desempenho.
Matematicamente, o análise discriminante linear (LDA) usa os dados de entrada para derivar os coeficientes de uma função de pontuação para cada categoria. Cada função recebe como argumentos as variáveis preditoras numéricas de um caso. Em seguida, ele dimensiona cada variável de acordo com seus coeficientes específicos de categoria e gera uma pontuação. O modelo LDA analisa a pontuação de cada função e usa a pontuação mais alta para alocar um caso a uma categoria (previsão). Chamamos essas funções de pontuação de funções discriminantes.
Como mencionamos, a análise discriminante é usada para prever a probabilidade de pertencer a uma determinada classe (ou categoria) com base em uma ou várias variáveis preditoras. Trabalha com variáveis preditoras contínuas e/ou categóricas. Em comparação com a regressão logística, a análise discriminante é mais adequada para prever a categoria de uma observação na situação em que a variável de resultado contém mais de duas classes. Além disso, é mais estável que a regressão logística para problemas de classificação multiclasse.
Observe que tanto a regressão logística quanto a análise discriminante podem ser usadas para tarefas de classificação binária. Neste artigo você aprenderá as técnicas e extensões de análise discriminante mais usadas. Além disso, forneceremos o código R para realizar os diferentes tipos de análise.
Os seguintes métodos de análise discriminante serão utilizados:
Mesmo que nossa visão esteja longe de ser perfeita, normalmente podemos dizer a diferença entre um carro, uma van e um ônibus. Podemos não distinguir um Saab 9000 de um Opel Manta. Foram carros feitos há cerca de 30 anos. Demonstraremos a análise discriminante prevendo o tipo de veículo em uma imagem.
As 4 categorias de veículos são ônibus de dois andares, van Chevrolet, Saab 9000 e Opel Manta 400. Os recursos de entrada não são os pixels da imagem bruta, mas são 18 recursos numéricos calculados a partir das silhuetas dos veículos.
Este conjunto de dados vem do Instituto Turing, Glasgow, Escócia. (https://www.turing.ac.uk). O propósito é classificar uma determinada silhueta como um dos quatro tipos de veículos, usando um conjunto de características extraídas da silhueta. o veículo pode ser visto de um dos muitos ângulos diferentes.
FONTE
Drs.Pete Mowforth and Barry Shepherd
Instituto Turing
George House
36 North Hanover St.
Glasgow
G1 2AD
Turing Institute Research Memorandum TIRM-87-018 “Vehicle Recognition Using Rule Based Methods” by Siebert,JP (March 1987)
Esses dados foram originalmente coletados entre 1986-87. Foi parcialmente financiado pela Barr and Stroud Ltd. O objetivo original era encontrar um método de distinguir objetos 3D dentro de uma imagem 2D pela aplicação de um conjunto de extratores de recursos de forma para as silhuetas 2D dos objetos. Medidas de características de forma extraídos de silhuetas de objetos a serem discriminados foram usados para gerar uma classe de árvore de regras de identificação por meio de indução computacional.
Esta estratégia de reconhecimento de objetos foi usada com sucesso para discriminar entre silhuetas de carros modelo, vans e ônibus visto de elevação restrita, mas todos os ângulos de rotação. O desempenho da classificação da árvore de regras comparou favoravelmente para MDC (classificador de distância mínima) e \(k\)-NN (\(k\)-vizinho mais próximo), classificadores estatísticos em termos de taxa de erro e eficiência computacional. Uma investigação dessas árvores de regras geradas pelo exemplo indicou que a estrutura em árvore foi fortemente influenciado pela orientação dos objetos.
Os recursos foram extraídos das silhuetas pela extensão HIPS (Hierarchical Image Processing System) BINATTS, que extrai uma combinação de recursos independentes de escala utilizando medidas baseadas em momentos clássicos, como variância escalada, assimetria e curtose sobre os eixos maiores/menores e medidas heurísticas como cavidades, circularidade, retangularidade e compacidade.
Quatro veículos modelo “Corgie” foram usados para o experimento: um ônibus de dois andares, uma van Cheverolet, um Saab 9000 e um Opel Manta 400. Essa combinação específica de veículos foi escolhida com a expectativa de que o ônibus, a van e qualquer um dos carros ser facilmente distinguível, mas seria mais difícil distinguir entre os carros.
As imagens foram adquiridas por uma câmera olhando para baixo no modelo do veículo a partir de um ângulo fixo de elevação de 34.2 graus com a horizontal. Os veículos foram colocados em uma superfície retroiluminada difusa (lightbox). Os veículos foram pintados de preto fosco para minimizar os destaques. As imagens foram capturadas usando um framestore CRS4000 conectado a um vax 750. Todas as imagens foram capturadas com uma resolução espacial de 128x128 pixels quantizada para 64 níveis de cinza.
Essas imagens foram limitadas para produzir silhuetas de veículos binários, negadas, isto para cumprir os requisitos de processamento do BINATTS e, posteriormente, submetidas a módulos HIPS de encolher-expandir-encolher para remover o ruído da imagem “sal e pimenta” (salt and pepper).
Os veículos foram girados e seu ângulo de orientação foi medido usando uma retícula radial abaixo do veículo. 0 e 180 graus corresponderam a vistas “de frente” e “traseira”, respectivamente, enquanto 90 e 270 corresponderam a perfis em direções opostas. Dois conjuntos de 60 imagens, cada conjunto cobrindo uma rotação completa de 360 graus, foram capturados para cada veículo. O veículo foi girado por um ângulo fixo entre as imagens. Esses conjuntos de dados são conhecidos como e2 e e3, respectivamente.
Outros dois conjuntos de imagens, e4 e e5, foram capturados com a câmera em elevações de 37.5 graus e 30.8 graus, respectivamente. Esses conjuntos também contêm 60 imagens por veículo, além do e4.van que contém apenas 46 devido à dificuldade de conter a van na imagem em algumas orientações.
Onde \(\mbox{sigma_maj**2}\) é a variação ao longo do eixo maior e \(\mbox{sigma_min**2}\) é a variação ao longo do eixo menor e area of hollows = area da poli-área delimitadora do objeto.
A área do polígono delimitador é encontrada como resultado lateral da computação para encontrar o comprimento máximo. Cada cálculo de comprimento individual produz um par de calibradores para o objeto orientado a cada 5 graus. O objeto é propagado em uma imagem contendo a união desses cursores para obter uma imagem do polígono delimitador.
Exemplos de imagens de carros para identificar:
Van chevrolet | Opel Manta 400 | Saab 9000 | Bus Double-decker |
---|---|---|---|
Para começar, carregamos as 846 instâncias em um data.frame chamado dados. As colunas são rotuladas pelas variáveis, com a coluna de resultado de destino chamada V19.
Estes dados foram extraídos do repositório: https://archive.ics.uci.edu/ml/datasets/statlog%2B(vehicle%2Bsilhouettes)
dados01 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xaa.dat", sep = "", header = FALSE)
dados02 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xab.dat", sep = "", header = FALSE)
dados03 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xac.dat", sep = "", header = FALSE)
dados04 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xad.dat", sep = "", header = FALSE)
dados05 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xae.dat", sep = "", header = FALSE)
dados06 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xaf.dat", sep = "", header = FALSE)
dados07 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xag.dat", sep = "", header = FALSE)
dados08 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xah.dat", sep = "", header = FALSE)
dados09 = read.csv(file = "http://leg.ufpr.br/~lucambio/MSM/xai.dat", sep = "", header = FALSE)
dados = data.frame(rbind(dados01,dados02,dados03,dados04,dados05,dados06,dados07,dados08,dados09))
head(dados)
## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19
## 1 95 48 83 178 72 10 162 42 20 159 176 379 184 70 6 16 187 197 van
## 2 91 41 84 141 57 9 149 45 19 143 170 330 158 72 9 14 189 199 van
## 3 104 50 106 209 66 10 207 32 23 158 223 635 220 73 14 9 188 196 saab
## 4 93 41 82 159 63 9 144 46 19 143 160 309 127 63 6 10 199 207 van
## 5 85 44 70 205 103 52 149 45 19 144 241 325 188 127 9 11 180 183 bus
## 6 107 57 106 172 50 6 255 26 28 169 280 957 264 85 5 9 181 183 bus
Número de classes 4: Opel, Saab, ônibus, van. NÚMERO DE EXEMPLOS 946, sendo Opel 240, Saab 240, Ônibus 240 e Van 226. NÚMERO DE ATRIBUTOS 18. 100 exemplos estão sendo mantidos pela Strathclyde para validação. Assim, os parceiros StatLog receberão 846 exemplos.
table(dados$V19)
##
## bus opel saab van
## 218 212 217 199
library(GGally)
par(mar=c(4,4,3,1), pch = 19)
ggpairs(dados[,c(1:4,19)], columns = 1:5, aes(color = dados$V19, alpha = 0.5),
upper = list(continuous = wrap("cor", size = 2.5)))
ggpairs(dados[,c(6:10,19)], columns = 1:5, aes(color = dados$V19, alpha = 0.5),
upper = list(continuous = wrap("cor", size = 2.5)))
ggpairs(dados[,c(11:14,19)], columns = 1:4, aes(color = dados$V19, alpha = 0.5),
upper = list(continuous = wrap("cor", size = 2.5)))
ggpairs(dados[,c(15:18,19)], columns = 1:4, aes(color = dados$V19, alpha = 0.5),
upper = list(continuous = wrap("cor", size = 2.5)))
library(MASS)
modelo.LDA = lda(V19 ~ . , data = dados)
modelo.LDA
## Call:
## lda(V19 ~ ., data = dados)
##
## Prior probabilities of groups:
## bus opel saab van
## 0.2576832 0.2505910 0.2565012 0.2352246
##
## Group means:
## V1 V2 V3 V4 V5 V6 V7 V8
## bus 91.59174 45.06881 76.72018 166.0046 63.43119 7.013761 170.0229 40.11468
## opel 95.06132 46.58019 89.08962 180.3019 60.87736 8.858491 182.1651 37.87736
## saab 97.28111 45.53456 88.67281 180.8018 61.14286 8.792627 179.6682 38.31797
## van 90.56281 42.07035 73.33166 147.1206 61.26131 9.713568 141.5377 47.93970
## V9 V10 V11 V12 V13 V14 V15 V16
## bus 20.57339 146.7018 192.8899 448.8945 180.9495 77.12385 4.844037 10.211009
## opel 21.58962 151.2736 198.6179 508.5377 179.7736 70.14151 6.603774 15.014151
## saab 21.44700 148.6912 197.1521 493.7972 179.4562 69.75576 7.658986 15.299539
## van 18.57789 145.1759 164.0101 298.2010 157.2764 72.77889 6.417085 9.698492
## V17 V18
## bus 187.8119 191.3257
## opel 189.2783 197.1132
## saab 189.7143 198.0415
## van 188.9397 196.1457
##
## Coefficients of linear discriminants:
## LD1 LD2 LD3
## V1 -0.0106353255 0.102335858 -0.209299215
## V2 -0.0112394608 -0.477795497 0.382868029
## V3 0.0080071272 0.119417228 0.029870081
## V4 0.1375713483 -0.038040326 0.032087671
## V5 -0.3865837011 0.089219388 -0.111757353
## V6 0.1393778108 -0.041762887 0.092613376
## V7 0.1038508578 -0.198776084 -0.087967851
## V8 0.3730202481 0.157783106 0.043845570
## V9 0.3813210708 -0.137962574 -0.692156073
## V10 -0.0466914641 0.231600123 0.026404021
## V11 0.0007379501 0.012256441 -0.016386692
## V12 -0.0232243051 0.028082784 0.029630855
## V13 -0.0002369531 0.008244785 -0.064562872
## V14 -0.0448890353 0.051530513 -0.005000712
## V15 0.0648588813 -0.033681576 0.002030132
## V16 -0.0227021950 -0.023885489 0.006388086
## V17 -0.3631540903 -0.018265170 0.147719168
## V18 0.2236763386 0.067511808 -0.137384517
##
## Proportion of trace:
## LD1 LD2 LD3
## 0.5271 0.4406 0.0323
library(tidyverse) # para fácil manipulação e visualização de dados
library(caret) # para facilitar o fluxo de trabalho de aprendizado de máquina
preditos.LDA = modelo.LDA %>% predict(dados)
names(preditos.LDA)
## [1] "class" "posterior" "x"
A função predict() retorna os seguintes elementos:
Inspecione os resultados:
# Classes previstas
head(preditos.LDA$class, 6)
## [1] van van saab van bus bus
## Levels: bus opel saab van
# Probabilidades previstas de pertencimento à classe.
head(preditos.LDA$posterior, 6)
## bus opel saab van
## 1 8.512500e-02 5.237495e-03 1.140482e-02 8.982327e-01
## 2 2.334737e-05 1.319130e-03 4.621132e-03 9.940364e-01
## 3 1.196748e-04 1.255393e-01 8.737069e-01 6.340907e-04
## 4 1.833487e-04 7.056117e-04 2.282041e-04 9.988828e-01
## 5 9.928223e-01 1.175472e-07 3.154479e-08 7.177598e-03
## 6 9.995034e-01 3.766693e-04 1.171969e-04 2.737161e-06
# Discriminantes lineares
head(preditos.LDA$x, 3)
## LD1 LD2 LD3
## 1 -1.2089806 1.5592207 -1.0723250
## 2 0.6351953 2.6989473 -0.6149956
## 3 1.6119614 -0.5829424 -1.6052023
Observe que você pode criar o gráfico LDA usando ggplot2 da seguinte forma:
library(ggplot2)
dados.LDA <- cbind(dados, predict(modelo.LDA)$x)
ggplot(dados.LDA, aes(LD1, LD2)) + geom_point(aes(color = V19))
ggplot(dados.LDA, aes(LD1, LD3)) + geom_point(aes(color = V19))
Você pode calcular a precisão do modelo da seguinte forma:
mean(preditos.LDA$class==dados$V19)
## [1] 0.7978723
Observe que, por padrão, o corte de probabilidade usado para decidir a participação no grupo é 0.5 (suposição aleatória). Por exemplo, o número de observações no grupo setosa pode ser recalculado usando:
sum(preditos.LDA$posterior[ ,1] >=.5)
## [1] 225
Em algumas situações, você pode querer aumentar a precisão do modelo. Nesse caso, você pode ajustar o modelo ajustando o corte de probabilidade a posteriori. Por exemplo, você pode aumentar ou diminuir o corte.
Observe que, se as variáveis preditoras forem padronizadas antes do cálculo do LDA, os pesos do discriminador podem ser usados como medidas de importância variável para a seleção de características.
QDA é um pouco mais flexível que LDA, no sentido de que não assume a igualdade de variância/covariância. Em outras palavras, para QDA a matriz de covariância pode ser diferente para cada classe. O LDA tende a ser melhor do que o QDA quando você tem um conjunto de treinamento pequeno.
Em contraste, QDA é recomendado se o conjunto de treinamento for muito grande, de modo que a variância do classificador não seja um problema importante, ou se a suposição de uma matriz de covariância comum para as classes K for claramente insustentável (James et al. 2014). QDA pode ser calculado usando a função R qda() [pacote MASS].
library(MASS)
# Ajuste do modelo
modelo.QDA = qda(V19 ~ . , data = dados)
modelo.QDA
## Call:
## qda(V19 ~ ., data = dados)
##
## Prior probabilities of groups:
## bus opel saab van
## 0.2576832 0.2505910 0.2565012 0.2352246
##
## Group means:
## V1 V2 V3 V4 V5 V6 V7 V8
## bus 91.59174 45.06881 76.72018 166.0046 63.43119 7.013761 170.0229 40.11468
## opel 95.06132 46.58019 89.08962 180.3019 60.87736 8.858491 182.1651 37.87736
## saab 97.28111 45.53456 88.67281 180.8018 61.14286 8.792627 179.6682 38.31797
## van 90.56281 42.07035 73.33166 147.1206 61.26131 9.713568 141.5377 47.93970
## V9 V10 V11 V12 V13 V14 V15 V16
## bus 20.57339 146.7018 192.8899 448.8945 180.9495 77.12385 4.844037 10.211009
## opel 21.58962 151.2736 198.6179 508.5377 179.7736 70.14151 6.603774 15.014151
## saab 21.44700 148.6912 197.1521 493.7972 179.4562 69.75576 7.658986 15.299539
## van 18.57789 145.1759 164.0101 298.2010 157.2764 72.77889 6.417085 9.698492
## V17 V18
## bus 187.8119 191.3257
## opel 189.2783 197.1132
## saab 189.7143 198.0415
## van 188.9397 196.1457
# Predições
preditos.QDA = modelo.QDA %>% predict(dados)
# Precisão do modelo
mean(preditos.QDA$class == dados$V19)
## [1] 0.9160757
O classificador LDA assume que cada classe vem de uma única distribuição normal ou gaussiana. Isso é muito restritivo. Uma alternativa é considerar MDA. Para MDA, existem classes e cada classe é considerada uma mistura gaussiana de subclasses, onde cada ponto de dados tem uma probabilidade de pertencer a cada classe. A igualdade da matriz de covariâncias, entre classes, ainda é assumida.
Para MDA, existem classes, e cada classe é considerada uma mistura gaussiana de subclasses, onde cada ponto de dados tem uma probabilidade de pertencer a cada classe. A igualdade da matriz de covariâncias, entre classes, ainda é assumida.
library(mda)
# Ajuste do modelo
modelo.MDA = mda(V19 ~ . , data = dados)
modelo.MDA
## Call:
## mda(formula = V19 ~ ., data = dados)
##
## Dimension: 11
##
## Percent Between-Group Variance Explained:
## v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11
## 54.89 76.47 86.08 94.44 96.46 98.01 99.01 99.60 99.87 99.97 100.00
##
## Degrees of Freedom (per dimension): 19
##
## Training Misclassification Error: 0.14894 ( N = 846 )
##
## Deviance: 612.017
# Predições
preditos.MDA = modelo.MDA %>% predict(dados)
# Precisão do modelo
mean(preditos.MDA == dados$V19)
## [1] 0.8510638
O MDA pode superar o LDA e o QDA em algumas situações, mas não neste exemplo.
O FDA é uma extensão flexível do LDA que usa combinações não lineares de preditores, como splines. O FDA é útil para modelar relações multivariadas de não normalidade ou não lineares entre variáveis dentro de cada grupo, permitindo uma classificação mais precisa.
# Ajuste do modelo
modelo.FDA = fda(V19 ~ . , data = dados)
# Preditos
preditos.FDA = modelo.FDA %>% predict(dados)
# Model accuracy
mean(preditos.FDA == dados$V19)
## [1] 0.7978723
RDA constrói uma regra de classificação regularizando as matrizes de covariância de grupo (Friedman 1989) permitindo um modelo mais robusto contra multicolinearidade nos dados. Isso pode ser muito útil para um grande conjunto de dados multivariados contendo preditores altamente correlacionados.
A análise discriminante regularizada é uma espécie de trade-off entre LDA e QDA. Lembre-se que, em LDA, assumimos igualdade de matriz de covariância para todas as classes. QDA assume matrizes de covariância diferentes para todas as classes. A análise discriminante regularizada é um intermediário entre LDA e QDA.
RDA reduz as covariâncias separadas de QDA em direção a uma covariância comum como em LDA. Isso melhora a estimativa das matrizes de covariância em situações em que o número de preditores é maior que o número de amostras nos dados de treinamento, potencialmente levando a uma melhoria da precisão do modelo.
library(klaR)
# Ajuste do modelo
modelo.RDA = rda(V19 ~ . , data = dados)
modelo.RDA
## Call:
## rda(formula = V19 ~ ., data = dados)
##
## Regularization parameters:
## gamma lambda
## 0.9997014 0.5369408
##
## Prior probabilities of groups:
## bus opel saab van
## 0.2576832 0.2505910 0.2565012 0.2352246
##
## Misclassification rate:
## apparent: 59.456 %
## cross-validated: 58.727 %
# Predições
preditos.RDA = modelo.RDA %>% predict(dados)
# Precisão do modelo
mean(preditos.RDA$class == dados$V19)
## [1] 0.4054374
Descrevemos a análise discriminante linear (LDA) e extensões para prever a classe de uma observação com base em múltiplas variáveis preditoras. A análise discriminante é mais adequada para problemas de classificação multiclasse em comparação com a regressão logística.
LDA assume que as diferentes classes têm a mesma variância ou matriz de covariância. Descrevemos muitas extensões do LDA neste artigo. A extensão mais popular da LDA é a análise discriminante quadrática (QDA), que é mais flexível que a LDA no sentido de que não assume a igualdade das matrizes de covariância do grupo.
LDA tende a ser melhor que QDA para pequenos conjuntos de dados. QDA é recomendado para grandes conjuntos de dados de treinamento. O melhor resultado de classificação foi encontrado utilizando a função discriminante quadrática.