CodeBlanks Logo Icon CodeBlanks

Meydan okuma 2

NumPy ve Pandas ile veri işlersin.

Meydan okuma 2: KNN'i sıfırdan yaz

KNN'in tüm mantığı birkaç satırdır: mesafeleri hesapla, en yakın k örneği seç, etiketlerinin çoğunluğunu al.

def knn_tahmin(X_egitim, y_egitim, q, k):
    d = np.sqrt(((X_egitim - q) ** 2).sum(axis=1))
    yakin = np.argsort(d)[:k]
    return np.bincount(y_egitim[yakin]).argmax()

Kendi uygulamanı scikit-learn'ünkiyle karşılaştırmak, algoritmayı gerçekten anladığını gösterir.

Uygulama Kendi KNN'in

knn_tahmin(X_egitim, y_egitim, q, k) fonksiyonunu yaz. Iris test kümesinin her örneği için k=5 ile tahmin üret ve doğruluğu round(..., 3) ile yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)

def knn_tahmin(X_egitim, y_egitim, q, k):
    d = np.sqrt(((X_egitim - q) ** 2).sum(axis=1))
    yakin = np.argsort(d)[:k]
    return np.bincount(y_egitim[yakin]).argmax()

p = np.array([knn_tahmin(X_train, y_train, q, 5) for q in X_test])
print(round((p == y_test).mean(), 3))

Beklenen çıktı

1.0

Uygulama scikit-learn ile karşılaştır

Aynı bölmede KNeighborsClassifier(n_neighbors=5) eğit. Kendi tahminlerin (p) ile onun tahminlerinin kaç örnekte aynı olduğunu (p == m.predict(X_test)).sum() ile ve test kümesi boyutunu aynı satırda yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
d = np.sqrt(((X_train[None, :, :] - X_test[:, None, :]) ** 2).sum(axis=2))
p = np.array([np.bincount(y_train[np.argsort(r)[:5]]).argmax() for r in d])

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
d = np.sqrt(((X_train[None, :, :] - X_test[:, None, :]) ** 2).sum(axis=2))
p = np.array([np.bincount(y_train[np.argsort(r)[:5]]).argmax() for r in d])

m = KNeighborsClassifier(n_neighbors=5).fit(X_train, y_train)
print((p == m.predict(X_test)).sum(), len(X_test))

Beklenen çıktı

45 45

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>np.argsort(d)[:k]</code> neyi verir?

  • En küçük k mesafenin indeksleri Doğru cevap
  • En büyük k mesafe
  • k'ıncı mesafe
  • Sıralı mesafeler

Açıklama: argsort küçükten büyüğe indeks verir; ilk k tanesi en yakın komşulardır.

2 Komşu etiketlerinin çoğunluğunu al.

Soru
sinif = np.bincount(y_egitim[yakin]).____()
Cevap
sinif = np.bincount(y_egitim[yakin]).argmax()

Açıklama: bincount her sınıfın oyunu sayar; argmax en çok oy alanı verir.

3 Adımları eşleştir.

Kavram Anlamı
((X - q) ** 2).sum(axis=1) Kare mesafeler
np.argsort(d)[:k] En yakın k
np.bincount Oy sayımı
argmax Kazanan sınıf

Başlangıç bölümündeki tüm dersler