NumPy kullanarak k-means algoritmasını sıfırdan yazın. k değerini nasıl seçersiniz ve algoritmanın sınırlamaları nelerdir?
Cevap
K-means, her noktayı en yakın merkeze atayıp merkezleri yeniden hesaplayarak küme içi kareler toplamını (inertia) minimize eden iteratif bir algoritmadır (Lloyd algoritması).
import numpy as np
def kmeans(X, k, n_iter=100, tol=1e-6, seed=0):
rng = np.random.default_rng(seed)
# k-means++ başlangıcı: merkezleri birbirinden uzak seç
centers = [X[rng.integers(len(X))]]
for _ in range(1, k):
d2 = np.min(((X[:, None] - np.array(centers)[None]) ** 2).sum(-1), axis=1)
centers.append(X[rng.choice(len(X), p=d2 / d2.sum())])
centers = np.array(centers)
for _ in range(n_iter):
# 1) Atama: her nokta en yakın merkeze (n, k) mesafe matrisi
dist = ((X[:, None, :] - centers[None, :, :]) ** 2).sum(-1)
labels = dist.argmin(axis=1)
# 2) Güncelleme: merkez = kümenin ortalaması (boş küme varsa eskisi kalır)
new = np.array([X[labels == j].mean(0) if np.any(labels == j) else centers[j]
for j in range(k)])
if np.linalg.norm(new - centers) < tol:
break
centers = new
inertia = ((X - centers[labels]) ** 2).sum()
return centers, labels, inertiaKarmaşıklık iterasyon başına O(n·k·d)'dir.
k nasıl seçilir?
- Elbow yöntemi: Farklı k değerleri için inertia çizilir, azalmanın yavaşladığı "dirsek" noktası seçilir.
- Silhouette score: -1 ile 1 arası, yüksek değer iyi ayrışmış kümeler demektir.
- İş gereksinimi: Çoğu zaman pazarlama segment sayısı gibi dış bir kısıt belirleyicidir.
Sınırlamalar
- Küresel, benzer boyutlu kümeler varsayar. Uzamış veya iç içe kümelerde başarısızdır (DBSCAN, GMM daha uygun).
- Başlangıca duyarlıdır, local optimum'a takılır. Çözüm: k-means++ ve birden fazla başlatma (
n_init). - Outlier'lara duyarlıdır, çünkü ortalama kullanır.
- Özellik ölçeğine duyarlıdır, önce standardization gerekir.
- Kategorik veride doğrudan çalışmaz (k-modes vb.).
İlgili Makine Öğrenmesi soruları
- Hiperparametre optimizasyonunu nasıl yaparsınız? Grid search, random search ve Bayesian optimization'ı karşılaştırın.
- Feature scaling nedir? Standardization ile normalization arasındaki fark nedir ve hangi modeller ölçeklendirme gerektirir?
- PCA (Principal Component Analysis) nasıl çalışır? Ne zaman kullanılır, ne zaman kullanılmamalıdır?
- XGBoost ve LightGBM klasik gradient boosting'den hangi açılardan farklıdır? En önemli hiperparametreleri nelerdir?
- Random Forest ile Gradient Boosting arasındaki fark nedir? Bagging ve boosting'i karşılaştırın.
- Lineer regresyon ile lojistik regresyon arasındaki fark nedir? Lojistik regresyonda neden MSE yerine log-loss kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.