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

Bölüm 3 · Klasik algoritmalar · Ders 12

Naive Bayes: olasılıkla karar

İki sensörü birleştirip "önde engel var mı?" sorusunu yanıtlamak

Veri. Robot her an iki sensör okur: ultrasonik mesafe ve IR yansıma. 120 etiketli ölçümümüz var: 70'i boş yolda, 50'si önde engel varken. İki sensör de gürültülü; tek başına hiçbiri güvenilir değil.

etiketli ölçümler120 ölçüm · 70 boş · 50 engel
1 / 12
naive_bayes.pypython
  1. import numpy as np
  2. D = np.genfromtxt('engel-sensoru.csv', delimiter=',', names=True) # 120 eğitim, 30 test ölçümü
  3. A, e, tr = np.c_[D['mesafe'], D['ir']], D['engel'].astype(int), D['grup'] == 0 # [mesafe cm, IR], 1 = engel
  4. X, y, Q = A[tr], e[tr], A[~tr]
  5. def fit(X, y):
  6. return [(X[y == c].mean(0), X[y == c].var(0), (y == c).mean()) for c in (0, 1)] # ortalama, varyans, önsel
  7. def logp(x, m, v, prior):
  8. return np.log(prior) - 0.5 * (np.log(2 * np.pi * v) + (x - m) ** 2 / v).sum() # bağımsız: log olasılıklar toplanır
  9. model = fit(X, y)
  10. for x in Q:
  11. s = [logp(x, *model[c]) for c in (0, 1)] # iki sınıfın puanı
  12. print(int(np.argmax(s))) # büyük olan kazanır
  13. y_test = e[~tr]
  14. def score(M, P): # log olasılık oranı: sıfırın üstü engel
  15. return np.array([logp(x, *M[1]) - logp(x, *M[0]) for x in P])
  16. history = {'n_train': [], 'train_acc': [], 'test_acc': []} # öğrenme eğrisi
  17. for m in range(1, 13):
  18. sub = np.arange(len(X)) % 12 < m # her 12 ölçümden ilk m tanesi
  19. M = fit(X[sub], y[sub])
  20. for k, v in zip(history, (sub.sum(), ((score(M, X[sub]) > 0) == y[sub]).mean(), ((score(M, Q) > 0) == y_test).mean())): history[k].append(float(v))
  21. s_test = score(model, Q); flag = s_test > 0
  22. tp, fp, fn = np.sum(flag & (y_test == 1)), np.sum(flag & (y_test == 0)), np.sum(~flag & (y_test == 1))
  23. r = s_test.argsort().argsort() + 1; P1 = y_test.sum() # sıralamaya göre ROC AUC
  24. auc = (r[y_test == 1].sum() - P1 * (P1 + 1) / 2) / (P1 * (len(y_test) - P1))
  25. for k, v in [('test_acc', history['test_acc'][-1]), ('precision', tp / max(tp + fp, 1)), ('recall', tp / max(tp + fn, 1)), ('auc', auc)]: # son ölçümler tablosu
  26. print(f'{k:<10}{v:>10.4f}')
  27. import csv
  28. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  29. csv.writer(f).writerows([list(history), *zip(*history.values())]) # satır başına bir eğitim büyüklüğü
  30. try:
  31. import matplotlib.pyplot as plt # varsa grafik çiz
  32. for k in ('train_acc', 'test_acc'): plt.plot(history['n_train'], history[k], marker='o', label=k)
  33. plt.xlabel('n_train'); plt.ylabel('accuracy'); plt.legend(); plt.show()
  34. except ImportError:
  35. 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.

  • Engel sensörleri: ultrasonik ve IRengel-sensoru.csv · 150 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.

naive_bayes.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Her sınıf için her sensörün ortalaması ve varyansı hesaplanır: dört çan eğrisi. Sınıfların oranı da önsel olasılıktır (70/120, 50/120).
  2. "Naive" varsayım: sınıf bilindiğinde sensörler birbirinden bağımsızdır. Böylece olasılıklar çarpılır, logaritmada toplanır.
  3. Yeni ölçüm için iki sınıfın log olasılığı hesaplanır; büyük olan kazanır.
  4. Sonuçta sınır eğri bir çizgidir (iki Gauss’un karşılaştığı yer). 30 saklı ölçümle doğruluk ölçülür.

Neden önemli

Az veriyle bile çalışır, eğitimi bir ortalama ve varyans hesabıdır, ve her kararın gerekçesi okunabilir. Veri madenciliğinin en çok kullanılan on algoritmasından biridir; spam süzgeçleri, arıza teşhisi ve sensör birleştirmede hâlâ yaygındı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ç