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.
import numpy as npD = np.genfromtxt('engel-sensoru.csv', delimiter=',', names=True) # 120 eğitim, 30 test ölçümüA, e, tr = np.c_[D['mesafe'], D['ir']], D['engel'].astype(int), D['grup'] == 0 # [mesafe cm, IR], 1 = engelX, y, Q = A[tr], e[tr], A[~tr]def fit(X, y):return [(X[y == c].mean(0), X[y == c].var(0), (y == c).mean()) for c in (0, 1)] # ortalama, varyans, önseldef logp(x, m, v, prior):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ırmodel = fit(X, y)for x in Q:s = [logp(x, *model[c]) for c in (0, 1)] # iki sınıfın puanıprint(int(np.argmax(s))) # büyük olan kazanıry_test = e[~tr]def score(M, P): # log olasılık oranı: sıfırın üstü engelreturn np.array([logp(x, *M[1]) - logp(x, *M[0]) for x in P])history = {'n_train': [], 'train_acc': [], 'test_acc': []} # öğrenme eğrisifor m in range(1, 13):sub = np.arange(len(X)) % 12 < m # her 12 ölçümden ilk m tanesiM = fit(X[sub], y[sub])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))s_test = score(model, Q); flag = s_test > 0tp, fp, fn = np.sum(flag & (y_test == 1)), np.sum(flag & (y_test == 0)), np.sum(~flag & (y_test == 1))r = s_test.argsort().argsort() + 1; P1 = y_test.sum() # sıralamaya göre ROC AUCauc = (r[y_test == 1].sum() - P1 * (P1 + 1) / 2) / (P1 * (len(y_test) - P1))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 tablosuprint(f'{k:<10}{v:>10.4f}')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 eğitim büyüklüğütry:import matplotlib.pyplot as plt # varsa grafik çizfor k in ('train_acc', 'test_acc'): plt.plot(history['n_train'], history[k], marker='o', label=k)plt.xlabel('n_train'); 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 →- Engel sensörleri: ultrasonik ve IRVeri 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
- 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).
- "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.
- Yeni ölçüm için iki sınıfın log olasılığı hesaplanır; büyük olan kazanır.
- 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 →