Bölüm 3 · Klasik algoritmalar · Ders 18
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 npX = np.genfromtxt('lidar-2b.csv', delimiter=',', skip_header=1) # 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 noktahistory = {'k': [], 'inertia': [], 'silhouette': []} # dirsek: k = 1…8 için aynı on denemeD = np.sqrt(((X[:, None] - X) ** 2).sum(2)) # 600 × 600 uzaklık (siluet için)for kk in range(1, 9):rng, bs = np.random.default_rng(17), np.inffor start in range(10):C = X[rng.choice(len(X), kk, replace=False)]while True:old, g = C.copy(), ((X[:, None] - C) ** 2).sum(2).argmin(1)C = np.array([X[g == j].mean(0) if (g == j).any() else C[j] for j in range(kk)]) # boş grup yerinde kalırif np.allclose(C, old): breaks = ((X - C[g]) ** 2).sum() # inertia: grup içi kare uzaklıkif s < bs: bs, bg = s, gM = np.eye(kk)[bg]; n = M.sum(0); S = D @ M # her noktadan her gruba toplam uzaklıka = (S * M).sum(1) / np.maximum(n[bg] - 1, 1) # kendi grubuna ortalama uzaklıkb = np.where((M > 0) | (n == 0), np.inf, S / np.maximum(n, 1)).min(1) # en yakın diğer grubasil = ((b - a) / np.maximum(a, b))[n[bg] > 1].sum() / len(X) if kk > 1 else 0.0 # siluet skoru (−1…1)for key, v in zip(history, (kk, bs, sil)): history[key].append(float(v))print(f'k={kk} inertia={bs:9.1f} siluet={sil:.3f}') # son ölçümler tablosuimport 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 ktry:import matplotlib.pyplot as plt # varsa grafik çizfig, (a1, a2) = plt.subplots(1, 2, figsize=(9, 3.5))a1.plot(history['k'], history['inertia'], 'o-'); a1.set_title('elbow'); a2.plot(history['k'], history['silhouette'], 'o-')a2.set_title('silhouette'); 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 →- Oda taraması (2B LiDAR)Veri 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 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.
- Şunu dene: k’yı 2 yap. İki grup tek gruba birleşir (200 · 400 nokta). Sonra 5 yap: büyük gruplar ikiye bölünür. k-ortalamalar grup sayısını kendisi bulamaz, onu sen verirsin; doğru k’yı seçmek için grafiğe bakmak ya da farklı k’ları karşılaştırmak gerekir.
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 →