Aprendizado Não Supervisionado | Redução de Dimensionalidade
Aplicando PCA e CDA
Hoje abordaremos com um experimento uma importante área da Aprendizagem Não-supervisionada: Redução de Dimensionalidade. Aplicaremos duas técnicas distintas, uma linear e outra não linear, em um problema para tentar transformar 4096 variáveis em… apenas uma! Parece desafiador, não? Antes de começarmos a nossa experiência, talvez o leitor esteja com uma dúvida: por que reduzir a dimensão dos nossos dados?
Maldição da Dimensionalidade
A Maldição da Dimensionalidade é um fenômeno que aparece quando temos uma quantidade de variáveis bem grande em um problema: às vezes, possuímos muitas variáveis altamente correlacionadas, ou seja, elas são redundantes; ou podemos ter variáveis que não apresentam informação útil ao problema. Isso faz com que o modelo selecionado possua muitos parâmetros, o que pode causar overfitting. Então, para evitar isso, utilizamos técnicas de Redução de Dimensionalidade.
Principal Components Analysis — PCA
Talvez a técnica mais conhecida de de Redução de Dimensionalidade seja o PCA. Sua popularidade é dada por dois motivos:
- É uma técnica não paramétrica, ou seja, não possui parâmetros
- É linear, simples e rápida
O PCA é baseado na variância dos dados, ou seja, ele tenta criar uma nova representação dos dados, com uma dimensão menor, mantendo a variância entre eles. Seus novos eixos são descorrelacionados (ou seja, a esperança do produtos deles é nula). Cada eixo possui uma variância, normalmente dada em % em relação ao todo. Na imagem do início desse post, há um gráfico com cujos eixos são os dois primeiros Componentes Principais com um total de 73% + 22.9% = 95.9% da variância total. Note que os dados do Iris (banco de dados utilizado na imagem do início)possui 4 dimensões, porém o PCA consegue manter 96% de variância com apenas 2 novos eixos. Praticamente uma redução de 50% das variáveis!
Não é difícil implementar essa técnica, esse tutorial ensina passo a passo. A biblioteca Sklearn já possui uma classe de PCA implementada. Futuramente, iremos preparar uma aula só para explicar o PCA, visto que ele possui uma grande importância nessa área, além de muitos outros algoritmos derivarem dele.
Curvilinear Distance Analysis — CDA
Essa técnica é pouco conhecida, porém é uma das técnicas mais poderosas de Redução de Dimensionalidade por ser uma técnica não linear. Ela é bem complicada de implementar e possui um custo computacional bem elevado comparado ao PCA, pois é baseado em distância de grafos. Para a sua implementação, esse artigo contém sua formulação matemática. Esse algoritmo requer alguns parâmetros, incluindo a nova dimensão dos dados.
Essa técnica e outras baseadas em distância serão explicadas em futuros posts.
Experimento Computacional
Para aplicar essas técnicas e comparar seus resultados, vamos fazer um experimento. Primeiro, pegamos o logo do Grupo Turing. Deixamos a imagem em Grayscale e reduzimos seu tamanho de 960x960 para 64x64. Depois, pegamos essa imagem e rotacionamos ela de 0º até 360º, 0.5º de cada vez, salvando a imagem rotacionada em um vetor de 4096 (64x64) variáveis. Obtemos assim uma tabela de 720 linhas e 4096 colunas.
O código da função que rotaciona as imagens está abaixo, foi utilizado a biblioteca OpenCV (cv2 no Python) para manipulação das imagens:
Temos então 720 dados de dimensão igual a 4096. Embora nosso problema tenha uma dimensão alta, só variamos o angulo entre as imagens. Será que conseguimos transformar esses dados para uma única dimensão? Parece impossível! Aplicando PCA, conseguimos reduzir de 4096 para 136 variáveis (com 99% da variância). Uma redução de 96.7% de variáveis! Porém, ainda não conseguimos chegar a uma única dimensão.
Utilizamos CDA para tentar transformar essas 136 variáveis obtidas pelo PCA em apenas 1. O algoritmo convergiu em 14 iterações, formando uma base de 720 dados de uma única dimensão. Em seguida, foram pegos 6 pontos dessa nova base, deixamos em ordem crescente e selecionamos as suas respectivas imagens para fazer o gráfico abaixo:
Podemos ver que, com essa única variável, somos capazes de achar a rotação da imagem! Conseguimos, então, transformar dados de dimensão igual a 4096 para uma única dimensão!
Conclusão
Nesse post introdutório, vimos uma aplicação de duas técnicas de redução de dimensionalidade: PCA, linear e simples; CDA, não linear e complexo. Conseguimos transformar 4096 variáveis em apenas uma. Mas como saberemos, em outros problemas, até quantas variáveis podemos reduzir? Como saber qual técnica vai performar melhor em cada problema? Como quantizar o erro de cada modelo? Muitas perguntas difíceis, mas não se assustem: apresentaremos a vocês em outros posts como responder tudo isso. Então não perca as próximas semanas, teremos uma boa quantidade de algoritmos dessa área para mostrar.