Sobes.tech
Middle

O que é o algoritmo k-vizinhos mais próximos (kNN)?

sobes.tech IA

Resposta da IA

O algoritmo dos k-vizinhos mais próximos (kNN) é um algoritmo simples e não paramétrico de aprendizagem de máquina, utilizado tanto para classificação quanto para regressão.

Essência: Atribui um novo objeto (ponto de dados) à classe mais representada entre os k vizinhos mais próximos no conjunto de treino. Para regressão, prevê um valor como a média/mediana dos valores dos k vizinhos mais próximos.

Principais passos para classificação:

  1. Escolher K: Determinar o número de vizinhos mais próximos (K).
  2. Calcular a distância: Calcular a distância entre o novo objeto e cada objeto no conjunto de treino (por exemplo, distância euclidiana).
  3. Encontrar K vizinhos mais próximos: Ordenar os objetos por distância e selecionar os K mais próximos.
  4. Votação: Determinar a classe do novo objeto com base na maioria dos votos entre os K vizinhos mais próximos.

Vantagens:

  • Facilidade de implementação e compreensão.
  • Não requer treino de modelo (algoritmo preguiçoso).
  • Adapta-se a novos dados à medida que eles aparecem.

Desvantagens:

  • Custoso computacionalmente com grandes volumes de dados (fase de previsão).
  • A escolha de K e a métrica de distância são críticas.
  • Sensível à escala das características e à "maldição da dimensionalidade".
  • Não funciona bem diretamente com características categóricas (requer codificação).

Aplicações:

  • Reconhecimento de padrões.
  • Sistemas de recomendação.
  • Diagnóstico médico.
  • Busca de documentos similares.
# Exemplo de implementação de kNN para classificação usando scikit-learn

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np

# Criação de dados de demonstração
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
y = np.array([0, 0, 1, 1, 0, 1]) # Rótulos de classes

# Divisão de dados em conjunto de treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Criação e treino do modelo kNN
# K=3, ou seja, 3 vizinhos mais próximos
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# Previsão no conjunto de teste
y_pred = knn.predict(X_test)

# Avaliação da precisão
accuracy = accuracy_score(y_test, y_pred)
# print(f"Precisão do modelo: {accuracy}")

# Previsão para um novo ponto
new_point = np.array([[3, 5]])
predicted_class = knn.predict(new_point)
# print(f"Classe prevista para o novo ponto: {predicted_class[0]}")