k-Means-Clustering¶
k-Means-Clustering teilt Daten(z.B Produkte, Kunden) in Gruppen(Cluster) ein.
K gibt die Anzahl der Gruppen an.
Die Daten/Informationen müssen quantifizierbar sein.
Beispiel Kunden: Einkommen, Persönlichkeitsmerkmale.
Fragestellung¶
Wie können Cluster für die folgenden Daten ermittelt werden?
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
samples, labels = make_blobs(n_samples=40, centers=3, cluster_std=0.50, random_state=0)
plt.scatter(samples[:,0], samples[:,1])
plt.show()
Cluster definieren¶
Um Clster definieren zu können sind zwei Fragen zu beantworten.
Wieviele Cluster gibt es und was gehört in welches Cluster?
1. Cluster-Anzahl¶
Bedeutung Erhöhung/Reduzierung Clusteranzahl:
Erhöhung der Cluster-Anzahl:
- Die Mitglieder eines Clusters werden sich ähnlicher
- Benachbarte Cluster werden schwerer zu unterscheiden
- Im Extremfall wird jeder Datenpunkt zu einem eigenen Cluster, dadurch lässt sich dann nichts mehr ableiten.
Reduzierung der Cluster-Anzahl:
- Die Mitglieder eines Clusters werden sich unähnlicher
- Benachbarte Cluster werden leichter zu unterscheiden
- Im Extremfall gibt e nur ein Cluster mit allen Datenpunkten, dadurch lässt sich dann nichts mehr ableiten.
Eine Methode zum Ermitteln der passenden Cluster-Anzahl ist der Scree-Test.
Dazu wird die Streuung/Variabilität innerhalb eines Clusters gegen die Cluster-Anzahl gestellt.
Ein Knick in dieser als Scree-Plot bezeichnenten Darstellug kann auf eine passenden Cluster-Anzahl hinweisen.
Im unten gezeigten fiktiven Beispiel liegt der Knick also die "passende" Cluster-Anzahl bei 3.
values = []
for amount_of_clusters in range(1, 11):
kmeans = KMeans(n_clusters=amount_of_clusters)
kmeans.fit(samples)
values.append(kmeans.inertia_)
plt.plot(range(1, 11), values)
plt.title('Scree Plot')
plt.xlabel('Cluster-Anzahl')
plt.ylabel('Streuung/Variabilität innerhalb der Cluster')
plt.show()
2. Was gehört zu welchem Cluster?¶
Für jeden Datenpunkt kann das Cluster der Funktion fit_predict aus dem Paket KMeans ermittelt werden.
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=40, n_init=10, random_state=0)
pred_y = kmeans.fit_predict(samples)
plt.scatter(samples[:,0], samples[:,1])
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red')
plt.show()
print('Koordinanten der Cluster-Mittelpunkte')
print(kmeans.cluster_centers_)
print('Die ermittelnen Cluster für jeden einzelnen Datenpunkt.')
print(pred_y)