KNN (K-Nearest Neighbors) #1

Como funciona?

Italo José
aibrasil
7 min readJul 1, 2018

--

O que é o KNN?

KNN(K — Nearest Neighbors) é um dos muitos algoritmos ( de aprendizagem supervisionada ) usado no campo de data mining e machine learning, ele é um classificador onde o aprendizado é baseado “no quão similar” é um dado (um vetor) do outro. O treinamento é formado por vetores de n dimensões.

Como ele funciona?

O funcionamento do KNN é bem simples, imagine que você tem dados de:

  • imagens de bolinhas roxas
  • imagens de bolinhas amarelas
  • Uma imagem de uma bolinha que você não sabe se é roxa ou amarela, mas tem todos os dados sobre ela.

Eai, como você vai fazer pra saber a cor dessa bolinha cuja a cor é desconhecida? Se ponha no lugar da máquina, imagine que você só tem os dados, você não está vendo as imagens de fato, você só está vendo o número RGB das cores de cada pixel (que são os dados que você tem da sua imagem).

obs: Vamos supor que dados com número 1 são referentes às bolinhas roxas e os dados com número 2 são referentes à bolinhas amarelas, isso apenas para facilitar a explicação, depois vamos trabalhar com dados reais.

Cada linha se refere a uma imagem e cada coluna se refere a um pixel dessa imagem, na última coluna nós temos a classe (cor) de cada uma das bolinhas, R ->roxo, e A -> amarelo, temos lá 5 imagens (5 linhas) de bolinhas, cada uma com sua classificação, você pode tentar descobrir a cor (no caso a classe) da nova imagem (uma imagem de uma bolinha que você não sabe a cor) de N maneiras, uma dessas N maneiras é ficar comparando essa nova imagem com todas as outras, e ver com qual ela se parece mais, se os dados dessa nova imagem (que você não sabe a classe dela) são mais próximos dos dados das imagens de bolinhas amarelas, então a cor da imagem nova que não está classificado é amarela, se os dados da imagem nova, forem mais parecidos com os dados das imagens de bolinha roxa, então essa a cor da bolinha da imagem nova é roxa, parece bobo mas é quase isso que o knn faz, só que de uma forma mais sofisticada.

No caso do KNN, ele não “compara” o seu novo dado (não classificado) com todos os outros de fato, na verdade ele executa um cálculo matemático para medir a distância entre os dados para fazer sua classificação, (que é quaaaaaaaaaaaase a mesma coisa #soqnao). Esse cálculo que estou falando pode ser qualquer um que meça a distância entre dois pontos, como por exemplo: Euclidiana, Manhattan, Minkowski, Ponderada e etc.

As etapas de um algoritmo KNN são:

1 — Recebe um dado não classificado;

2 — Mede a distância (Euclidiana, Manhattan, Minkowski ou Ponderada) do novo; dado com todos os outros dados que já estão classificados;

3 — Obtém as X(no caso essa variável X é o parâmetro K) menores distâncias;

4 — Verifica a classe de cada da um dos dados que tiveram a menor distância e conta a quantidade de cada classe que aparece;

5 — Toma como resultado a classe que mais apareceu dentre os dados que tiveram as menores distâncias;

6 — Classifica o novo dado com a classe tomada como resultado da classificação

Abaixo há uma imagem com esse processo, você tem um dado não classificado (em vermelho) e todos os seus outros dados já classificados(amarelo e roxo) cada um com sua classe (A e B). Então você calcula a distância do seu novo dado com todos os outros pra saber quais estão mais próximos(quais tem as menores distâncias), feito isso você você pega 3(ou 6) dos dados mais próximos e verifica qual é a classe que mais aparece, no caso da imagem abaixo, os dados mais próximos do novo dado são aqueles que estão dentro do primeiro círculo (de dentro pra fora), e ali dentro há 3 outros dados (já classificados), com isso vamos verificar qual é a classe predominante ali dentro, olha só, é o roxo, pois há 2 bolinhas roxas e apenas 1 amarela, looooogo esse novo dado que antes não estava classificado, agora ele será classificado como roxo.

Calculando a distancia:

Para calcular a distância entre dois pontos (sua nova amostra e todos os outros dados que você tem no seu dataset) é muito simples, como dito anteriormente, há várias formas de obter esse valor, neste artigo vamos usar a distância euclidiana, pois é uma das mais usadas.

A forma da distância euclidiana se encontra logo abaixo :

Espere, não se assuste, não é tão complicado quanto parece, depois de ler esse artigo e continuar achando complexo, quando chegarmos no código você vai ver o quão simples isso tudo é.

É com essa fórmula que você vai verificar a distância entre 1 ponto(sua amostra nao classificada) e 1 outro ponto do seu dataset(1 outro dado já classificado) para então ver a similaridade dos dois, quanto menor é o resultado dessa “continha” mais é a similaridade entre esses dois dados. E sim, você vai rodar esse cálculo vaaaarias vezes, até ter rodados em todos os dados, quando você fizer isso, você vai ter um array(vamos usar um array como exemplo) com o resultado de cada vez que você calculou a distância(no caso, a similaridade) do seu dado não classificado para um outro dado já classificado.

Agora vamos pro calculo de fato, é simples mas leia com calma essa parte, basicamente você vai tirar a raiz quadrada da soma dos resultados da subtração de cada característica do ponto1(amostra não classificada) para o ponto2(amostra já classificada. Confuso? Vamos fazer isso em uma planilha então

Vamos usar o exemplo da planilha anterior mas agora com 1 dado sem classificação, que é a informação que queremos classificar.

Temos 5 dados(linhas) nesse exemplo, cada amostra(dado) com seus respectivos atributos(características), vamos IMAGINAR que tudo isso fossem imagens, cada linha seria uma imagem e cada coluna seria um pixel dessa imagem, ou então vamos supor que cada registro seja relacionado a um tumor, e cada coluna a uma característica desse tumor, como tamanho, raio, peso e etc.

Vamos entao calcular, seguindo aquela explicação confusa acima, vamos começar pelo final, vamos começar pela subtração, queremos verificar a distancia da linha 1 da planilha pra todas as outras linhas, entao vamos começar!

Vamos pegar a primeira linha, que é o dado que queremos classificar e vamos medir a distancia euclidiana pra linha 2

1 — Subtração

Vamos subtrair cada atributo(coluna) da linha 1 com os atributos da linha 2,exemplo:

2 — Exponenciação:

Depois de ter feito a subtração da coluna 1 da linha 1, com a coluna 1 da linha 2, vamos elevar isso ao quadrado para que os números fiquem positivos exemplo:

3 — Soma

Depois de ter feito o passo 2 para todas as colunas da linha 1 e linha 2, vamos somar todos esses resultados, se fizermos isso pras colunas lá da imagem da planilha, vamos ter o seguinte resultado:

Note que temos 8 colunas de atributos, tanto na linha 1 como na linha 2, e nós executamos o passo 2 para cada atributo do nosso dataset, no final o resultado foi 8, por que 8? Porque cada vez que rodamos o passo 2, o resultado deu 1, isso porque por uma “coincidência” nós temos os dados de todas as colunas iguais e o resultado de (1–2)² é igual à 1, usei esses valores para facilitar na hora de fazer as contas, mas não, seus atributos não precisam ser sempre o mesmo número, mais tarde vamos ver isso melhor na implementação do código com esse algoritmo.

4 — Raiz quadrada:

Após ter feito o passo 3, vamos agora tirar a raiz quadrada do resultado da soma das subtrações elevadas ao quadrado. No passo 3, o resultado foi 8, então vamos tirar a raiz quadrada de 8:

Pronto, agora você tem a distância euclidiana da linha 1 para a linha 2, viu, não foi tão difícil, deu pra fazer até na mão!

Agora você só precisa fazer esses pra todas as linhas, da linha 1 para todas as outras linhas, quando você fizer isso, você terá a distância Euclidiana da linha 1 para todas as outras linhas, aí você vai ordená-las do menor pro maior, verificar quais são as K(3 por exemplo) menores distâncias e verificar qual é a classe que aparece mais, a classe que mais aparecer vai ser a classe que você vai usar para classificar a linha 1 (que desde o início não estava classificada) .

Simples não é? Nos próximos artigos nós vamos começar a fazer a implementação desse algoritmo em GO! Mas não se preocupem, a sintaxe do Go é tão simples que você ira ira seguir acompanhar e aplicar isso na sua linguagem.

[Momento jabá]

Não deixe de se tornar membro da nossa comunidade (AI BRASIL) que está ganhando o brasil, já estamos em São Paulo em no Rio de Janeiro (por enquanto!), fazemos meetups todos os meses, e em todos os meetups temos hands-ons, falando de assuntos como o desse artigo, só que de uma forma mais aprofundada e com “tira duvidas” !.

Link: https://meetup.com/pt-BR/ai-brasil/

--

--