Okullar için Robotik ve Mühendislik · anaokulundan liseye

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.

etiketli ölçümler90 ölçüm · k = 5
1 / 23
knn.pypython
  1. import numpy as np
  2. D = np.genfromtxt('renk-sensoru.csv', delimiter=',', names=True) # 90 etiketli, 45 test ölçümü
  3. A, s, tr = np.c_[D['ton'], D['parlaklik']], D['sinif'].astype(int), D['grup'] == 0 # [ton, parlaklık], sınıf
  4. X, y, T, y_test = A[tr], s[tr], A[~tr], s[~tr]
  5. Q = T[:5] # ilk beş yeni ölçüm
  6. k = 5 # komşu sayısı
  7. for q in Q:
  8. d = ((X - q) ** 2).sum(1) # her ölçüme uzaklık²
  9. near = d.argsort()[:k] # en yakın k ölçüm
  10. votes = np.bincount(y[near], minlength=3) # sınıf oyları
  11. print(votes.argmax()) # en çok oy alan
  12. pred = [np.bincount(y[((X - t) ** 2).sum(1).argsort()[:k]], minlength=3).argmax() for t in T]
  13. print((np.array(pred) == y_test).mean()) # test doğruluğu
  14. def knn(P, k): # her nokta için k-NN tahmini
  15. return np.array([np.bincount(y[((X - t) ** 2).sum(1).argsort()[:k]], minlength=3).argmax() for t in P])
  16. history = {'k': [], 'train_acc': [], 'test_acc': []} # k'ye göre doğruluk
  17. for kk in range(1, 26, 2):
  18. for key, v in zip(history, (kk, (knn(X, kk) == y).mean(), (knn(T, kk) == y_test).mean())): history[key].append(float(v))
  19. 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 tahmin
  20. print(cm)
  21. for c in range(3): # sınıf başına kesinlik, duyarlılık, F1
  22. P, R = cm[c, c] / max(cm[:, c].sum(), 1), cm[c, c] / max(cm[c].sum(), 1)
  23. print(f'sınıf {c}: P={P:.3f} R={R:.3f} F1={2 * P * R / max(P + R, 1e-12):.3f}')
  24. import csv
  25. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  26. csv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir k
  27. try:
  28. import matplotlib.pyplot as plt # varsa grafik çiz
  29. for key in ('train_acc', 'test_acc'): plt.plot(history['k'], history[key], marker='o', label=key)
  30. plt.xlabel('k'); plt.ylabel('accuracy'); plt.legend(); plt.show()
  31. except ImportError:
  32. 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.

  • Renk sensörü: üç nesnerenk-sensoru.csv · 135 satır · 4 sütun
    Veri setini indir
  • Çiçek ölçüleri (iris benzeri)alıştırmacicek-olculeri.csv · 150 satır · 5 sütun
    Veri 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.

knn.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Yeni ölçümün eğitim verisindeki her ölçüme uzaklığı hesaplanır.
  2. En yakın k ölçüm seçilir ve her biri kendi sınıfına bir oy verir.
  3. En çok oy alan sınıf tahmindir. Eğitim yoktur: model, verinin kendisidir.
  4. 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 →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç