Bölüm 3 · Klasik algoritmalar · Ders 11
k en yakın komşu (k-NN)
Renk sensörüyle nesne tanımak: yeni ölçüm, komşularına bakar
Veri. Robot kolun ucundaki renk sensörü her nesne için iki sayı ölçer: ton ve parlaklık. Elimizde 90 etiketli ölçüm var: kırmızı top, mavi silindir, sarı küp. Kol yeni bir nesneyi kavradığında hangisi olduğunu söylemeli.
import numpy as npD = np.genfromtxt('renk-sensoru.csv', delimiter=',', names=True) # 90 etiketli, 45 test ölçümüA, s, tr = np.c_[D['ton'], D['parlaklik']], D['sinif'].astype(int), D['grup'] == 0 # [ton, parlaklık], sınıfX, y, T, y_test = A[tr], s[tr], A[~tr], s[~tr]Q = T[:5] # ilk beş yeni ölçümk = 5 # komşu sayısıfor q in Q:d = ((X - q) ** 2).sum(1) # her ölçüme uzaklık²near = d.argsort()[:k] # en yakın k ölçümvotes = np.bincount(y[near], minlength=3) # sınıf oylarıprint(votes.argmax()) # en çok oy alanpred = [np.bincount(y[((X - t) ** 2).sum(1).argsort()[:k]], minlength=3).argmax() for t in T]print((np.array(pred) == y_test).mean()) # test doğruluğudef knn(P, k): # her nokta için k-NN tahminireturn np.array([np.bincount(y[((X - t) ** 2).sum(1).argsort()[:k]], minlength=3).argmax() for t in P])history = {'k': [], 'train_acc': [], 'test_acc': []} # k'ye göre doğrulukfor kk in range(1, 26, 2):for key, v in zip(history, (kk, (knn(X, kk) == y).mean(), (knn(T, kk) == y_test).mean())): history[key].append(float(v))cm = np.zeros((3, 3), int); np.add.at(cm, (y_test, np.array(pred)), 1) # karışıklık matrisi: satır gerçek, sütun tahminprint(cm)for c in range(3): # sınıf başına kesinlik, duyarlılık, F1P, R = cm[c, c] / max(cm[:, c].sum(), 1), cm[c, c] / max(cm[c].sum(), 1)print(f'sınıf {c}: P={P:.3f} R={R:.3f} F1={2 * P * R / max(P + R, 1e-12):.3f}')import csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yazcsv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir ktry:import matplotlib.pyplot as plt # varsa grafik çizfor key in ('train_acc', 'test_acc'): plt.plot(history['k'], history[key], marker='o', label=key)plt.xlabel('k'); plt.ylabel('accuracy'); plt.legend(); plt.show()except ImportError:print('matplotlib yok: grafik atlandı')
Eğitim paneli
Eğitim çalıştırılıyor…
Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.
Veri seti
Tüm veri setleri →- Renk sensörü: üç nesneVeri setini indir
- Çiçek ölçüleri (iris benzeri)alıştırmaVeri setini indir
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Yeni ölçümün eğitim verisindeki her ölçüme uzaklığı hesaplanır.
- En yakın k ölçüm seçilir ve her biri kendi sınıfına bir oy verir.
- En çok oy alan sınıf tahmindir. Eğitim yoktur: model, verinin kendisidir.
- k = 1 her gürültülü noktaya uyar ve sınırlar parçalanır; k büyüdükçe sınırlar yumuşar. k'yi değiştir, sınırları ve test doğruluğunu izle.
Neden önemli
En basit sınıflandırıcıdır ama çoğu zaman şaşırtıcı derecede iyidir; yeni bir yöntemin karşılaştırıldığı ilk çizgidir. Aynı fikir, yapay zekâ uygulamalarındaki vektör aramanın temelidir: bir sorunun cevabını bulmak için anlamca en yakın metinler aranır.
ESOF 323, 11. hafta: robotlarda derin öğrenme →