K-Means

Kategori: Machine Learning , 15 Aralık 2019 , JanFranco


Clustering bölümüne giriş yapıyoruz. Clustering'de amaç tahmin veya bir sınıflandırma yapmak değil, verileri kümelemektir. En bilinen algoritmalardan K-Means algoritması ile bir Clustering örneği yapacağız. K-Means algoritması şu şekilde çalışır: Belirlenen değer kadar nokta rastgele olarak seçilir. Daha sonra bu noktaların yakılarındaki noktalar, bir kümeye dahil edilir. Örneğin 3 küme olacak dedik. Veri kümesini 2 boyutlu olarak düşünelim. Bu 2 boyutlu düzlemde 3 nokta seçildi. A, B, C noktaları. A noktasına yakın değerler A kümesine, B noktasına yakın değerler B kümesine, C noktasına yakın değerler C kümesine dahil edildi. Belirli bir adımdan sonra kümelerin ağırlık merkezleri hesaplanır. Rastgele seçilen 3 nokta güncellenir ve kümeleme işlemine devam edilir. Bir nokta hangi kümenin merkezine yakınsa o kümeye dahil edilir. Bir kümeye dahil edilen veri tekrar güncellenerek başka bir kümeye dahil olabilir.

Algoritmanın bir çok dezavantajı bulunuyor. Bunlardan ilki küme sayısının belirtiliyor olması. Ancak biz bu dezavantajı bir yöntem ile çözeceğiz. Bir diğer dezavantaj noktaların rastgele seçilmesi. Örneğin 3 küme olması gerekiyor. Bir küme sol üst köşede, bir küme sol alt köşede, bir küme de y ekseni boyunca sağ tarafta toplanmış. 3 nokta rastgele dağılırken eğer 2 nokta sağdaki kümeden bir nokta da sol kısımda seçilirse, sol taraftaki olması gereken 2 küme tek küme olarak değerlendirilir, tek küme olması gereken sağ taraftaki küme ise ikiye bölünür. Bu problemin de tabi ki çözümleri var ancak kesin çözümler değil tabi ki.

Küme sayısının verilmesini dezavantajını WCSS metriği ile küçük de olsa bir çözüm üretebiliriz. WCSS metriği, oluşturulan kümelerdeki elemanların, ağırlık merkezine olan uzaklıklarının karesidir. Eğer birden ona kadar bir döngü açıp, küme sayısını birden ona kadar verip WCSS metriklerini hesaplatırsak, sonucun sıfıra doğru gittiğini görebiliriz. Bunun sebebini şöyle açıklayayım, örneğin elimizde 100 veri var. Eğer küme sayısını 100 verirsek, algoritma her bir veriyi bir sınıf olarak düşünecektir. Her verinin bulunduğu sınıfın ağırlık merkezi yine kendisi olacağı için tüm değerler 0 çıkacak ve sonuç sıfır olacaktır. Biz birden ona kadar küme sayısını değiştirip sonuçları 2 boyutlu bir grafikte görüntülersek, grafiğin belli bir noktasında dirsek denilen bir kırılma meydana gelecektir. Bu kırılmanın başlangıç noktası ile bitiş noktası arasındaki değerleri küme sayısı olarak seçebiliriz. Python üzerinden örnek yapalım, verileri ve kütüphaneleri alalım:


import pylab as pl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df = pd.read_csv('musteriler.csv')
print(df)
x = df.iloc[:, [3, 4]]

>>

      No Cinsiyet  Yas   Hacim  Maas
0      1        K   60   69900  6325
1      2        K   30   79000  5200
2      3        E   52   85500  7825
3      4        E   57   17100  8375
4      5        E   55    5500  5450
5      6        E   68   27200  8550
6      7        E   41   20500  4500
7      8        E   20   69000  5050
8      9        K   33   13200  8325
9     10        E   37   31800  5975
10    11        K   33   59200  5700
11    12        E   21   95800  6475
12    13        E   48   46200  3850
13    14        E   46   29800  4100
14    15        K   68   83000  8125
15    16        K   35  143500  8650
16    17        E   72   91300  5125
17    18        K   20    9800  3950
18    19        K   26   79500  5325
19    20        E   60   66400  5775
20    21        K   49   25900  3400
21    22        K   22       0  7075
22    23        E   41   90900  5725
23    24        K   30   51800  4300
24    25        E   56  126800  7500
25    26        K   56   40800  5000
26    27        E   66   26400  5325
27    28        K   45   76100  5350
28    29        E   29   26500  2600
29    30        E   32   37200  6250
..   ...      ...  ...     ...   ...
170  171        K   57   87500  4950
171  172        K   23   29500  6500
172  173        K   39   17300  6325
173  174        K   30   39000  6875
174  175        E   28   63500  5175
175  176        E   67   27700  8925
176  177        K   22   23300  7825
177  178        K   32   53600  5350
178  179        K   73  111800  8075
179  180        K   65   55400  5675
180  181        E   39   44700  4750
181  182        E   57   72900  6200
182  183        K   38   59700  6975
183  184        E   69  124800  9525
184  185        E   72  100700  6675
185  186        K   66  136200  9275
186  187        E   22    4400  4750
187  188        K   30    3000  7975
188  189        E   41   33300  6225
189  190        E   23   20600  2800
190  191        E   57   44700  5450
191  192        E   25   10000  2875
192  193        K   74   39200  5975
193  194        E   44   75600  6175
194  195        E   44   13200  5325
195  196        E   22   96600  7900
196  197        E   39   83700  7675
197  198        K   25   34000  4000
198  199        K   30   42000  5500
199  200        K   23   47600  4150
Yukarıda bahsettiğim WCSS metriğini kullanarak küme sayısını belirlemye çalışalım:


res = []
for i in range(1, 10):
    kMeans = KMeans(n_clusters=i)
    kMeans.fit(x)
    res.append(kMeans.inertia_)

plt.plot(range(1, 10), res)
plt.show()
K-Means

Burada görüyoruz ki küme sayısını 2, 3 ve 4 değerlerinden almak mantıklı. 3 alıp sonuçları görelim:


kMeans = KMeans(n_clusters=3)
kMeans.fit(x)
pl.figure('Before Clustering')
pl.scatter(x.values[:, 0], x.values[:, 1])
pl.show()
pl.figure('After Clustering')
pl.scatter(x.values[:, 0], x.values[:, 1], c=kMeans.labels_)
pl.show()
K-Means

K-Means


Sonraki Yazı: Hierarchical Clustering
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın