Sobes.tech
Middle

Czym jest algorytm k najbliższych sąsiadów (kNN)?

sobes.tech AI

Odpowiedź od AI

Algorytm najbliższych sąsiadów (kNN) to prosty, niemający parametrów algorytm uczenia maszynowego, używany zarówno do klasyfikacji, jak i regresji.

Istota: Przypisuje nowy obiekt (punkt danych) do klasy, która jest najbardziej reprezentowana wśród k najbliższych mu obiektów w zbiorze treningowym. Dla regresji przewiduje wartość jako średnią/medianę wartości k najbliższych sąsiadów.

Główne kroki dla klasyfikacji:

  1. Wybór K: Określenie liczby najbliższych sąsiadów (K).
  2. Obliczanie odległości: Obliczenie odległości między nowym obiektem a każdym obiektem w zbiorze treningowym (np. odległość euklidesowa).
  3. Znajdź K najbliższych: Posortuj obiekty według odległości i wybierz K najbliższych.
  4. Głosowanie: Określenie klasy nowego obiektu na podstawie większości głosów wśród K najbliższych sąsiadów.

Zalety:

  • Łatwa implementacja i zrozumienie.
  • Nie wymaga trenowania modelu (leniwym algorytmem).
  • Dostosowuje się do nowych danych w miarę ich pojawiania się.

Wady:

  • Obliczeniowo kosztowny przy dużych zbiorach danych (w fazie predykcji).
  • Wybór K i metryki odległości jest krytyczny.
  • Wrażliwy na skalę cech i "klątwę wymiarowości".
  • Nie działa dobrze bezpośrednio z cechami kategorycznymi (wymaga kodowania).

Zastosowania:

  • Rozpoznawanie wzorców.
  • Systemy rekomendacji.
  • Diagnostyka medyczna.
  • Wyszukiwanie podobnych dokumentów.
# Przykład implementacji kNN dla klasyfikacji z użyciem 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

# Tworzenie danych demonstracyjnych
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]) # Etykiety klas

# Podział danych na zbiór treningowy i testowy
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Tworzenie i trenowanie modelu kNN
# K=3, czyli 3 najbliższych sąsiadów
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# Predykcja na zbiorze testowym
y_pred = knn.predict(X_test)

# Ocena dokładności
accuracy = accuracy_score(y_test, y_pred)
# print(f"Dokładność modelu: {accuracy}")

# Predykcja dla nowego punktu
new_point = np.array([[3, 5]])
predicted_class = knn.predict(new_point)
# print(f"Przewidywana klasa dla nowego punktu: {predicted_class[0]}")