AI Atlas
Başlangıç· ~2 dk okuma#k-nn#k-nearest-neighbors#lazy-learning

k-En Yakın Komşu

k-Nearest Neighbors · k-NN

Yeni bir örnek için, eğitim verisindeki en yakın k komşuya bakıp onların etiket çoğunluğunu (sınıflandırmada) ya da ortalamasını (regresyonda) tahmin olarak veren basit ama güçlü algoritma.

EN YAKIN KOMŞULAR?k = 3Yeni nokta, en yakın k komşunun çoğunluk etiketini alır.
Tanım

k-NN'nin "eğitimi" yoktur denilebilir; algoritma tüm eğitim verisini hafızada tutar. Tahmin sırasında yeni örneğe en yakın k tane komşuyu bulur (genelde öklid uzaklığıyla), sınıflandırmada onların etiket çoğunluğunu, regresyonda etiketlerinin ortalamasını döner. Bu yüzden k-NN'ye tembel öğrenici (lazy learner) denir — iş tahmin anına ertelenir.

En kritik parametreler: k (kaç komşu), uzaklık metriği (öklid, manhattan, kosinüs) ve özellik ölçeklendirme. k çok küçükse model gürültüye duyarlı olur (aşırı öğrenme), çok büyükse sınır bulanıklaşır (yetersiz öğrenme). Genelde tek sayı seçilir (oy eşitliği olmasın diye).

k-NN herhangi bir veri yapısı varsayımı yapmaz, doğrusal olmayan sınırları öğrenebilir, hem sınıflandırma hem regresyon yapar. Maliyeti tahmin zamanında yatar: her yeni örnek için tüm eğitim verisinde uzaklık hesaplaması — büyük veride yavaş. KD-Tree, Ball-Tree, ANN (Approximate Nearest Neighbor) algoritmalarıyla hızlandırılabilir.

Benzetme

Bir sokakta yeni açılan bir restoran için 'iyi mi kötü mü' diye karar vermen lazım. Restoranın tarzına en yakın 5 başka restoranın yorumlarına bakarsın: 4'ü iyi puan almışsa muhtemelen bu da iyidir. Hiçbir 'restoran iyiliği genel kuralı' çıkarmadın; sadece en yakın 5 örnekten yola çıkıp karar verdin. k-NN tam olarak bunu yapar — kuralsız, sadece komşuluk.

Gerçek dünyadan örnek

Bir e-ticaret sitesi "bu ürünü beğenen başka neyi de beğenir?" önerisi sunmak istiyor. Klasik collaborative filtering yaklaşımı aslında bir k-NN varyantı: her ürünün vektörünü (kullanıcı davranışı, kategori, fiyat, açıklama embedding'i) çıkar, yeni bir ürüne en yakın k tane diğer ürünü bul, onlardan öneri listesi yap.

Vektör uzayı yüksek boyutlu olduğu için klasik öklid uzaklığı yerine kosinüs benzerliği kullanılıyor. ANN kütüphanesi (FAISS veya HNSW) ile sorgu süresi milyon ürün arasında milisaniyelere iniyor. Model eğitimi yok, ürün ekleme anında vektörü ekliyor; canlıda sürekli büyüyebilen bir öneri sistemi.

Kod örnekleri
scikit-learn · k-NN sınıflandırmaPython
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score

# Ölçek farkları k-NN'i öldürür → scaler şart
pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("knn", KNeighborsClassifier(n_neighbors=7, weights="distance")),
])

# Birden fazla k için çapraz doğrulama
for k in [1, 3, 5, 7, 11, 21]:
    pipe.set_params(knn__n_neighbors=k)
    scores = cross_val_score(pipe, X, y, cv=5, scoring="f1_macro")
    print(f"k={k:2d}  F1={scores.mean():.3f} ± {scores.std():.3f}")
Ne zaman kullan
  • Veri kümesi küçük-orta boyutlu (eğitim verisi hızlı arama yapmana izin verecek kadar)
  • Sınıf sınırları doğrusal değil ve karmaşık ise
  • Modeli sürekli güncellemek gerekiyorsa — yeni veri eklemek 'eğitim' anlamına gelmez
  • Hızlı bir baseline ya da öneri sistemi gerektiğinde
Ne zaman kullanma
  • Çok büyük veri ve düşük gecikme şartı varsa — her tahmin tüm veriye bakar
  • Çok yüksek boyutlu uzayda 'uzaklık' kavramı bozulur (boyut laneti) — özellik seçimi veya boyut indirgeme yap
  • Özellikler farklı ölçeklerde ve normalize etmeden çalıştırırsan
Sık yapılan hatalar

Ölçeklemeyi unutmak

Bir özellik 0–1, diğeri 0–1.000.000 ise sadece büyük olanın etkisi vardır. StandardScaler veya MinMaxScaler her zaman önce gelir.

k seçiminde aşırılık

k=1 gürültüye aşırı duyarlı, k=N tüm veride çoğunluğu söyleyen anlamsız bir model. CV ile farklı k'lar dene; tek sayı tercih et.

Boyut laneti

Yüksek boyutta tüm noktalar yaklaşık aynı uzaklıkta gibi davranır. PCA ya da UMAP ile düşük boyutta çalışmak doğruluğu çoğu zaman katlar.