Home

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?

In [111]:
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.

In [112]:
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.

In [127]:
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)
Koordinanten der Cluster-Mittelpunkte
[[ 1.76148384  0.94720951]
 [-1.60261283  2.80150709]
 [ 1.1701937   4.27686729]]
Die ermittelnen Cluster für jeden einzelnen Datenpunkt.
[0 2 1 0 0 2 0 2 1 0 2 2 2 2 0 1 1 2 2 2 0 1 1 1 1 0 1 0 0 1 1 0 2 0 2 1 2
 1 0 2]
Impressum