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

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

Temel bileşen analizi (PCA)

İki IMU ölçümünü, bilgiyi kaybetmeden tek sayıya indirmek

Veri. Rampa çıkan robotun IMU’su 200 kez ileri ve yan ivmeyi ölçtü. Robot rampaya çapraz durduğu için iki sayı birlikte artıp azalıyor: aslında tek bir şeyi, rampanın eğimini anlatıyorlar.

ileri ve yan ivme200 ölçüm
1 / 46
pca.pypython
  1. import numpy as np
  2. A = np.genfromtxt('imu.csv', delimiter=',', skip_header=1) # 200 ölçüm: [ax, ay], m/s²
  3. Z = A - A.mean(0) # ortala
  4. S = Z.T @ Z / len(Z) # kovaryans matrisi
  5. vals, vecs = np.linalg.eigh(S) # özdeğerler, özvektörler
  6. pc = vecs[:, vals.argmax()] # en çok değişen yön
  7. z = Z @ pc # her ölçüm artık tek sayı
  8. print(vals.max() / vals.sum()) # korunan varyans oranı
  9. tot = (Z ** 2).sum(1).mean() # toplam varyans
  10. history = {'angle': [], 'variance': [], 'recon_error': []} # açı taraması
  11. for deg in range(0, 181, 5):
  12. u = np.array([np.cos(np.radians(deg)), np.sin(np.radians(deg))])
  13. v = ((Z @ u) ** 2).mean() # bu eksendeki varyans
  14. for k, x in zip(history, (deg, v, tot - v)): history[k].append(float(x))
  15. for k, v in [('lambda1', vals.max()), ('lambda2', vals.min()), # son ölçümler
  16. ('kept', vals.max() / vals.sum()), ('recon_mse', vals.min())]:
  17. print(f'{k:<10}{v:>8.4f}')
  18. import csv
  19. with open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir açı
  20. csv.writer(f).writerows([list(history), *zip(*history.values())])
  21. try:
  22. import matplotlib.pyplot as plt # varsa grafik çiz
  23. for k in ('variance', 'recon_error'): plt.plot(history['angle'], history[k], label=k)
  24. plt.xlabel('angle (deg)'); plt.legend(); plt.show()
  25. except ImportError:
  26. 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.

  • IMU ivme ölçümleriimu.csv · 200 satır · 2 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.

pca.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Önce veri ortalanır: her ölçümden ortalama çıkarılır.
  2. Kovaryans matrisi, iki sayının birlikte nasıl değiştiğini özetler.
  3. En büyük özdeğerin özvektörü, veriyi o yöne izdüşürünce varyansın en büyük olduğu yöndür. Sahnede eksen döndükçe varyansın nasıl değiştiğini görürsün.
  4. Noktalar bu çizgiye izdüşürülür: iki sayı yerine bir sayı. Korunan varyans oranı ne kadar bilgi kaldığını söyler.

Neden önemli

Çok boyutlu sensör verisini sıkıştırmak, gürültüyü azaltmak ve görselleştirmek için ilk araçtır. Görüntü işlemede yüz tanımadan (özyüzler) nokta bulutlarında yüzey yönünü bulmaya kadar, robotikte her yerde karşına çıkar.

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ç