K-Means Kümeleme Algoritması

K-Means, verileri K adet kümeye ayıran, her kümenin merkezi etrafında gruplandıran popüler bir kümeleme algoritmasıdır. Bu algoritma, veri noktalarını birbirine en yakın merkezlere atayarak ve merkez konumlarını yeniden hesaplayarak çalışır. İteratif bir süreç sonucunda, veri noktaları doğal gruplarına ayrılır.

Avantajlar

  • Basit, anlaşılabilir ve uygulanması kolay bir algoritmadır
  • Büyük veri setlerinde bile etkili ve verimlidir
  • Yakınsama genellikle hızlıdır ve az sayıda iterasyon gerektirir
  • Farklı küme şekillerine ve boyutlarına uyarlanabilir
  • Kümelerin merkez noktalarını açıkça gösterir

Dezavantajlar

  • Optimum küme sayısı (k) önceden belirlenmelidir
  • Başlangıç merkezlerinin rastgele seçimi sonuçları etkileyebilir
  • Yalnızca küresel küme şekillerine uygun çalışır, karmaşık şekillerde başarısız olabilir
  • Gürültülü verilere ve aykırı değerlere karşı hassastır
  • Farklı yoğunluklardaki kümeleri belirlemede zorlanabilir

İnteraktif Demo

K-Means algoritmasını deneyimlemek için aşağıdaki parametreleri ayarlayın ve algoritmanın çalışmasını adım adım gözlemleyin.

Algoritma Parametreleri

Verilerin kaç farklı kümeye ayrılacağını belirler.

Kümelenecek veri noktalarının sayısı.

Veri noktalarının dağılım tipi.

Veri Görünümü

Kod Örnekleri

K-Means kümeleme algoritmasının farklı programlama dillerindeki implementasyonları.

K-Means Algoritması - TypeScript
1// K-means algoritması implementasyonu
2function kMeansAlgorithm(
3 points: Point[],
4 k: number,
5 maxIterations: number = 100
6): { points: Point[], centroids: Point[], iterations: number } {
7 if (points.length < k) {
8 throw new Error("Nokta sayısı küme sayısından az olamaz.");
9 }
10
11 // Rastgele merkez noktaları seç
12 const centroids: Point[] = [];
13 const usedIndices = new Set();
14
15 // Rastgele, tekrarlanmayan indekslerde merkezler seç
16 while (centroids.length < k) {
17 const randomIndex = Math.floor(Math.random() * points.length);
18 if (!usedIndices.has(randomIndex)) {
19 usedIndices.add(randomIndex);
20 centroids.push({
21 x: points[randomIndex].x,
22 y: points[randomIndex].y,
23 cluster: centroids.length
24 });
25 }
26 }
27
28 // Noktaların en yakın merkezlere atanması
29 let iterations = 0;
30 let isConverged = false;
31
32 while (!isConverged && iterations < maxIterations) {
33 // Noktaları en yakın merkezlere ata
34 assignPointsToClusters(points, centroids);
35
36 // Önceki merkezleri sakla
37 const oldCentroids = JSON.parse(JSON.stringify(centroids));
38
39 // Merkez noktalarını güncelle
40 const hasUpdated = updateCentroids(points, centroids, k);
41
42 // Merkez noktalar değişmediyse yakınsama sağlanmıştır
43 isConverged = !hasUpdated;
44 iterations++;
45 }
46
47 return { points, centroids, iterations };
48}
49
50// Noktaları en yakın merkezlerine ata
51function assignPointsToClusters(points: Point[], centroids: Point[]): void {
52 for (const point of points) {
53 let minDistance = Infinity;
54 let closestCluster = 0;
55
56 // Her nokta için en yakın merkezi bul
57 for (let i = 0; i < centroids.length; i++) {
58 const distance = euclideanDistance(point, centroids[i]);
59 if (distance < minDistance) {
60 minDistance = distance;
61 closestCluster = i;
62 }
63 }
64
65 // Noktayı en yakın kümeye ata
66 point.cluster = closestCluster;
67 }
68}
69
70// Merkez noktalarını güncelle
71function updateCentroids(points: Point[], centroids: Point[], k: number): boolean {
72 let hasUpdated = false;
73
74 // Her küme için yeni merkez hesapla
75 for (let i = 0; i < k; i++) {
76 const clusterPoints = points.filter(p => p.cluster === i);
77
78 // Küme boşsa güncelleme yapma
79 if (clusterPoints.length === 0) continue;
80
81 // Yeni merkezi hesapla (ortalama)
82 const sumX = clusterPoints.reduce((sum, p) => sum + p.x, 0);
83 const sumY = clusterPoints.reduce((sum, p) => sum + p.y, 0);
84 const newX = sumX / clusterPoints.length;
85 const newY = sumY / clusterPoints.length;
86
87 // Merkez değiştiyse güncelle
88 if (centroids[i].x !== newX || centroids[i].y !== newY) {
89 centroids[i].x = newX;
90 centroids[i].y = newY;
91 hasUpdated = true;
92 }
93 }
94
95 return hasUpdated;
96}
97
98// İki nokta arasındaki Öklid mesafesi
99function euclideanDistance(p1: Point, p2: Point): number {
100 return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
101}

Algoritma Nasıl Çalışır?

K-Means algoritması, veri noktalarını benzerliklerine göre K sayıda kümeye ayırmak için kullanılan gözetimsiz bir öğrenme algoritmasıdır. Algoritma, noktaları birbirine benzer gruplara ayırarak veri setindeki doğal yapıları ortaya çıkarmayı amaçlar.

Temel Çalışma Prensibi

K-Means algoritması, dört ana adımda çalışır:

  1. Başlatma: K adet merkez noktası (centroid) rastgele seçilir. Bu merkezler, kümelerin başlangıç noktalarını temsil eder.
  2. Atama: Her veri noktası, kendisine en yakın merkeze atanır. Yakınlık genellikle Öklid mesafesi ile ölçülür.
  3. Güncelleme: Her küme için yeni merkez hesaplanır. Yeni merkez, kümeye atanan tüm noktaların ortalama koordinatıdır.
  4. Yakınsama: 2. ve 3. adımlar, merkezler artık değişmeyene kadar veya maksimum iterasyon sayısına ulaşılana kadar tekrarlanır.

Mesafe Ölçütü

K-Means algoritmasında en yaygın kullanılan mesafe ölçütü, Öklid mesafesidir:

Öklid Mesafesi: İki nokta arasındaki düz çizgi mesafesi. d(p, q) = √[(px - qx)2 + (py - qy)2]

Başlangıç Merkez Seçim Stratejileri

K-Means algoritmasının performansı, başlangıç merkezlerinin seçimine büyük ölçüde bağlıdır. Yaygın başlangıç stratejileri:

  • Rastgele Seçim: Merkezler rastgele veri noktaları arasından seçilir.
  • K-Means++: Merkezler, birbirinden uzak olma olasılığı daha yüksek olan noktalara ağırlık verilerek seçilir.
  • Forgy Yöntemi: Merkezler, veri setinden rastgele K nokta seçilerek başlatılır.

K Değerinin Seçimi

Optimum K değerini belirlemek için çeşitli yöntemler:

  • Dirsek Yöntemi (Elbow Method): Farklı K değerleri için küme içi varyansın (WCSS) grafiği çizilir ve "dirsek" noktası optimal K olarak seçilir.
  • Silhouette Analizi: Her kümeleme için silhouette katsayısı hesaplanır ve en yüksek skoru veren K değeri seçilir.
  • Gap İstatistiği: Gözlenen kümelemenin beklenen kümelemeden ne kadar farklı olduğunu ölçer.

Algoritmanın Güçlü ve Zayıf Yönleri

Güçlü Yönler:

  • Basit ve uygulaması kolaydır
  • Büyük veri setlerinde bile verimli çalışır
  • Lineer zaman karmaşıklığı: O(n * k * i) - n: nokta sayısı, k: küme sayısı, i: iterasyon sayısı
  • Sonuçların yorumlanması kolaydır

Zayıf Yönler:

  • K değeri önceden belirlenmelidir
  • Başlangıç merkezlerine bağımlıdır ve yerel optimumlara takılabilir
  • Küresel olmayan küme şekillerini belirlemede başarısızdır
  • Aykırı değerlere duyarlıdır
  • Farklı boyut ve yoğunluktaki kümeleri ayırt etmekte zorlanır

Gerçek Dünya Uygulamaları

K-Means algoritması birçok alanda yaygın olarak kullanılır:

  • Müşteri Segmentasyonu: Benzer satın alma davranışlarına sahip müşteri gruplarını belirlemek
  • Görüntü İşleme: Görüntü segmentasyonu ve renk kantizasyonu
  • Belge Sınıflandırma: Benzer konulardaki belgeleri gruplamak
  • Anomali Tespiti: Normal davranıştan sapan veri noktalarını belirlemek
  • Öznitelik Öğrenme: Veri setindeki gizli özellikleri keşfetmek