Makine Öğrenmesi · Bölüm 6
k-means: etiketsiz gruplar
LiDAR noktalarını nesnelere ayırmak, tek bir cevap verilmeden
Veri. Robot süpürgenin LiDAR'ı odayı taradı ve 600 nokta gördü: 250'si duvarda, 200'ü kanepede, 150'si masa ayaklarında. Program hangi noktanın hangi nesneye ait olduğunu hiç görmez; yalnız kaç grup arayacağını bilir: k = 3.
import numpy as npfrom lidar import X # 600 nokta (x, y), metrek = 3 # bulunacak grup sayısırng = np.random.default_rng(17)best = np.inf # henüz deneme yokfor start in range(10): # on rastgele başlangıçC = X[rng.choice(len(X), k, replace=False)] # üç nokta merkez olurwhile True:old = C.copy() # merkezleri hatırlad = ((X[:, None] - C) ** 2).sum(2) # her merkeze uzaklık²g = d.argmin(1) # en yakın merkez kazanırC = np.array([X[g == j].mean(0) for j in range(k)]) # ortalamaya taşıif np.allclose(C, old): break # kimse kıpırdamadıs = d.min(1).sum() # toplam kare uzaklıkif s < best: best, keep = s, g # en sıkısını saklaprint(np.bincount(keep)) # grup başına nokta
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.
Nasıl çalışır
- Her deneme rastgele üç noktayı merkez seçerek başlar.
- Her nokta en yakın merkeze katılır.
- Her merkez, kendi noktalarının ortalamasına taşınır. Hiçbir merkez kıpırdamayana kadar tekrar.
- Bazı denemeler kötü bir başlangıçta takılır. Bu yüzden on deneme yapılır, toplam kare uzaklığı en küçük olan kalır.
Neden önemli
Cevap gerektirmez: kimsenin etiketlemediği verideki grupları bulur. Robotikte LiDAR ve derinlik kamerası noktalarını engellere ayırmakta, renk kümelemede ve harita sıkıştırmada kullanılır. Vektör arama kütüphanesi FAISS da devasa koleksiyonları k-means ile gruplara böler; arama yalnız en yakın birkaç gruba bakar.
ESOF 323, 11. hafta: robotlarda derin öğrenme →