CodeBlanks Logo Icon CodeBlanks

KMeans algoritması

KMeans, k centroidi rastgele başlatır ve iteratif olarak günceller.

Lloyd algoritması

KMeans'in standart çözümü Lloyd algoritmasıdır. Her adımda inertia ya azalır ya aynı kalır; bu yüzden algoritma her zaman yakınsar, ama bulduğu çözüm yerel bir en iyi olabilir.

def kmeans_adim(X, merkez):
    d = ((X[:, None, :] - merkez[None, :, :]) ** 2).sum(axis=2)
    etiket = d.argmin(axis=1)                                   # atama
    yeni = np.array([X[etiket == k].mean(axis=0) for k in range(len(merkez))])
    return etiket, yeni                                         # güncelleme

n_iter_, yakınsamaya kadar kaç tur gerektiğini gösterir; max_iter üst sınırdır.

Yayınlamayla mesafe matrisi

X[:, None, :] - merkez[None, :, :] ifadesi (n, 1, d) ile (1, k, d) şekillerini (n, k, d)'ye yayınlar; son eksen boyunca toplam, her örneğin her merkeze kare mesafesini verir. Döngüsüz ve hızlıdır:

print(X.shape, merkez.shape)               # (500, 2) (5, 2)
d = ((X[:, None, :] - merkez[None, :, :]) ** 2).sum(axis=2)
print(d.shape)                             # (500, 5)

Aynı kalıp KNN'de, RBF çekirdeğinde ve attention hesabında da karşına çıkacak.

Uygulama Elle KMeans

İlk 5 örneği başlangıç merkezi alarak Lloyd algoritmasını 10 tur çalıştır (atama + güncelleme). Son inertia değerini (en yakın merkeze kare mesafelerin toplamı) round ile tam sayı olarak yazdır.

Başlangıç kodu

model.py
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

X, _ = make_blobs(n_samples=500, centers=5, cluster_std=1.0, random_state=3)

# buraya yaz

Örnek çözüm

model.py
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

X, _ = make_blobs(n_samples=500, centers=5, cluster_std=1.0, random_state=3)

merkez = X[:5].copy()
for _ in range(10):
    d = ((X[:, None, :] - merkez[None, :, :]) ** 2).sum(axis=2)
    etiket = d.argmin(axis=1)
    merkez = np.array([X[etiket == k].mean(axis=0) for k in range(5)])
d = ((X[:, None, :] - merkez[None, :, :]) ** 2).sum(axis=2)
print(round(d.min(axis=1).sum()))

Beklenen çıktı

1083

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Lloyd algoritmasında inertia bir turdan diğerine nasıl değişir?

  • Rastgele değişir
  • Hep sabittir
  • Azalır ya da aynı kalır Doğru cevap
  • Her zaman artar

Açıklama: Hem atama hem güncelleme adımı kare mesafe toplamını artıramaz.

2 Her örneği en yakın merkeze ata.

Soru
etiket = d.____(axis=1)
Cevap
etiket = d.argmin(axis=1)

Açıklama: argmin(axis=1) her satırda en küçük mesafenin sütununu verir.

3 Parçaları eşleştir.

Kavram Anlamı
atama d.argmin(axis=1)
güncelleme Küme ortalaması
n_iter_ Yakınsama turu
yerel en iyi Lloyd'un sınırı

Orta seviye bölümündeki tüm dersler