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.
import numpy as nprng = np.random.default_rng(4)A = rng.normal([24, 32], [2.2, 2.8], (40, 2)) # tip A: g, mmB = rng.normal([34, 47], [2.2, 2.8], (40, 2)) # tip BX = np.vstack([A, B]); y = np.r_[-np.ones(40), np.ones(40)]val = np.arange(80) % 4 == 3 # her 4. parça doğrulamatr = ~val # eğitim parçalarıZ = (X - X[tr].mean(0)) / X[tr].std(0) # ölçekleZ = np.c_[Z, np.ones(80)] # b için sabit 1C = 1.0 # yumuşak marja = np.zeros(80); w = np.zeros(3) # her noktaya bir αK = 'epoch', 'loss', 'acc', 'val_acc', 'margin', 'n_sv'history = {k: [] for k in K} # eğitim geçmişidef kaydet(e): # dönem sonu ölçümlerim = y * (Z @ w) # y·f: pozitifse doğruloss = .5 * w @ w + C * np.maximum(0, 1 - m[tr]).sum() # amaç: ceza + hingeacc, vacc = (m[tr] > 0).mean(), (m[val] > 0).mean()mg = 2 / np.linalg.norm(w[:2]) # marj genişliğirow = e + 1, loss, acc, vacc, mg, (a > 1e-6).sum()for k, v in zip(K, row): history[k].append(float(v))for epoch in range(50):for i in rng.permutation(np.flatnonzero(tr)):G = y[i] * Z[i] @ w - 1 # kenara göre paynew = np.clip(a[i] - G / (Z[i] @ Z[i]), 0, C) # α: 0 ile C arasıw += (new - a[i]) * y[i] * Z[i] # w = Σ α·y·za[i] = newkaydet(epoch)f = Z @ w # karar değeriprint('hata', (np.sign(f[tr]) != y[tr]).sum()) # eğitimdesv = a > 1e-6 # destek vektörleriprint('destek', sv.sum(), np.abs(f[sv]).round(3)) # kenarda: |f| = 1print('marj', 2 / np.linalg.norm(w[:2])) # ölçekli birimdepos, neg = f[val & (y > 0)], f[val & (y < 0)]auc = (pos[:, None] > neg).mean() # doğrulamada ROC AUCfor k in ('loss', 'acc', 'val_acc', 'margin'):print(f'{k:<9}{history[k][-1]:>9.3f}') # son ölçümlerprint(f'{"val_auc":<9}{auc:>9.3f}')import csvwith open('egitim_gecmisi.csv', 'w', newline='') as fh:w_ = csv.writer(fh); w_.writerow(K) # satır başına bir dönemw_.writerows(zip(*history.values()))try:import matplotlib.pyplot as plt # varsa grafikfor k in ('acc', 'val_acc'):plt.plot(history['epoch'], history[k], label=k)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 →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.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- 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‖.
- Amaç: ½‖w‖² (marjı geniş tut) + C·Σ max(0, 1 − y·f) (hinge kaybı: kenarı aşan her nokta ceza öder).
- 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.
- 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.
- Ş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 →