Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

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

Destek vektör makinesi

İki parça türü arasında en geniş boşluğu bırakan çizgi

Veri. Ayıklama bandından iki tür braket geçiyor. Bant üzerindeki yük hücresi her parçanın ağırlığını (g), lazer kapısı uzunluğunu (mm) ölçüyor. Operatör 80 parçayı etiketledi: 40 tip A, 40 tip B. Robot kol tip B’yi ayrı kutuya itecek; iki türü ayıran çizgiyi ve iki tür arasında olabildiğince geniş bir güvenlik boşluğunu arıyoruz.

40 tip A, 40 tip B80 parça · C = 1,00
1 / 67
svm.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(4)
  3. A = rng.normal([24, 32], [2.2, 2.8], (40, 2)) # tip A: g, mm
  4. B = rng.normal([34, 47], [2.2, 2.8], (40, 2)) # tip B
  5. X = np.vstack([A, B]); y = np.r_[-np.ones(40), np.ones(40)]
  6. val = np.arange(80) % 4 == 3 # her 4. parça doğrulama
  7. tr = ~val # eğitim parçaları
  8. Z = (X - X[tr].mean(0)) / X[tr].std(0) # ölçekle
  9. Z = np.c_[Z, np.ones(80)] # b için sabit 1
  10. C = 1.0 # yumuşak marj
  11. a = np.zeros(80); w = np.zeros(3) # her noktaya bir α
  12. K = 'epoch', 'loss', 'acc', 'val_acc', 'margin', 'n_sv'
  13. history = {k: [] for k in K} # eğitim geçmişi
  14. def kaydet(e): # dönem sonu ölçümleri
  15. m = y * (Z @ w) # y·f: pozitifse doğru
  16. loss = .5 * w @ w + C * np.maximum(0, 1 - m[tr]).sum() # amaç: ceza + hinge
  17. acc, vacc = (m[tr] > 0).mean(), (m[val] > 0).mean()
  18. mg = 2 / np.linalg.norm(w[:2]) # marj genişliği
  19. row = e + 1, loss, acc, vacc, mg, (a > 1e-6).sum()
  20. for k, v in zip(K, row): history[k].append(float(v))
  21. for epoch in range(50):
  22. for i in rng.permutation(np.flatnonzero(tr)):
  23. G = y[i] * Z[i] @ w - 1 # kenara göre pay
  24. new = np.clip(a[i] - G / (Z[i] @ Z[i]), 0, C) # α: 0 ile C arası
  25. w += (new - a[i]) * y[i] * Z[i] # w = Σ α·y·z
  26. a[i] = new
  27. kaydet(epoch)
  28. f = Z @ w # karar değeri
  29. print('hata', (np.sign(f[tr]) != y[tr]).sum()) # eğitimde
  30. sv = a > 1e-6 # destek vektörleri
  31. print('destek', sv.sum(), np.abs(f[sv]).round(3)) # kenarda: |f| = 1
  32. print('marj', 2 / np.linalg.norm(w[:2])) # ölçekli birimde
  33. pos, neg = f[val & (y > 0)], f[val & (y < 0)]
  34. auc = (pos[:, None] > neg).mean() # doğrulamada ROC AUC
  35. for k in ('loss', 'acc', 'val_acc', 'margin'):
  36. print(f'{k:<9}{history[k][-1]:>9.3f}') # son ölçümler
  37. print(f'{"val_auc":<9}{auc:>9.3f}')
  38. import csv
  39. with open('egitim_gecmisi.csv', 'w', newline='') as fh:
  40. w_ = csv.writer(fh); w_.writerow(K) # satır başına bir dönem
  41. w_.writerows(zip(*history.values()))
  42. try:
  43. import matplotlib.pyplot as plt # varsa grafik
  44. for k in ('acc', 'val_acc'):
  45. plt.plot(history['epoch'], history[k], label=k)
  46. plt.legend(); plt.show()
  47. except ImportError:
  48. 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.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

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.

svm.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Karar değeri f = w·x + b. f = 0 karar çizgisi, f = +1 ve f = −1 iki kenar çizgisi; aralarındaki şerit marj, genişliği 2/‖w‖.
  2. Amaç: ½‖w‖² (marjı geniş tut) + C·Σ max(0, 1 − y·f) (hinge kaybı: kenarı aşan her nokta ceza öder).
  3. Her noktanın bir ağırlığı α vardır (0 ile C arası), w = Σ α·y·x. Noktalar sırayla gezilir; kenarını aşan noktanın α’sı büyür, rahat olanınki sıfıra iner. Bu, SMO’nun tek değişkenli hâlidir.
  4. Sonunda α’sı sıfır olmayan birkaç nokta kalır: destek vektörleri. Çizgiyi yalnız onlar belirler; diğer 70 küsur parçayı silsen çizgi kıpırdamaz.
  5. Şunu dene: C’yi 0,05’e indir. Ceza ucuzlar, marj genişler, birçok nokta şeridin içine girer ve destek vektörü sayısı artar.

Neden önemli

SVM, derin öğrenmeden önce görüntü ve sinyal sınıflamanın baş aracıydı; az veriyle bile kararlı ve açıklanabilir sınır çizer. Robotikte parça ayıklama, HOG + SVM ile yaya ve nesne tespiti, titreşim sinyalinden arıza teşhisi gibi işlerde hâlâ kullanılır. Çekirdek (kernel) hilesiyle aynı yöntem eğri sınırlar da çizer.

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ç