# Imports
from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn import metrics
# Daten herunterladen
wines = datasets.load_wine()
# Daten skalieren
scaler = StandardScaler()
data_scaled = scaler.fit_transform(wines.data);
# K-Means anwenden. Wir wissen, dass 3 Zielklassen existieren, daher erwarten wir n_clusters=3 Cluster
# Bei Daten ohne Zielklasse muss dieser Parameter variiert werden!
# Wir geben an, mit welchem random_state die zufälligen Anfangszentroide festgelegt werden sollen.
kmeans = cluster.KMeans(n_clusters=3, random_state=0, n_init=10).fit(data_scaled)
# Welche Cluster wurden für die Instanzen gefunden?
print(kmeans.labels_)
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
# Wie groß sind die Cluster? Wir möchten 3 Cluster sehen.
for i in range(0,3):
print("Name:", i, "Größe: ", list(kmeans.labels_).count(i))
# Wir können uns auch die Zentroide anzeigen lassen - diese geben Aufschluss über die Charakteristika der Cluster
# und sind daher für die Interpretation der Cluster nützlich.
print (kmeans.cluster_centers_)
Name: 0 Größe: 65
Name: 1 Größe: 51
Name: 2 Größe: 62
[[-0.92607185 -0.39404154 -0.49451676 0.17060184 -0.49171185 -0.07598265
0.02081257 -0.03353357 0.0582655 -0.90191402 0.46180361 0.27076419
-0.75384618]
[ 0.16490746 0.87154706 0.18689833 0.52436746 -0.07547277 -0.97933029
-1.21524764 0.72606354 -0.77970639 0.94153874 -1.16478865 -1.29241163
-0.40708796]
[ 0.83523208 -0.30380968 0.36470604 -0.61019129 0.5775868 0.88523736
0.97781956 -0.56208965 0.58028658 0.17106348 0.47398365 0.77924711
1.12518529]]
def bench_k_means(kmeans, name, data, labels):
"""Benchmark to evaluate the KMeans initialization methods.
Parameters
----------
kmeans : KMeans instance
A :class:`~sklearn.cluster.KMeans` instance that has already been trained
name : str
Name given to the strategy. It will be used to show the results in a
table.
data : ndarray of shape (n_samples, n_features)
The data whose clusters should be evaluated.
labels : ndarray of shape (n_samples,)
The labels used to compute the supervised clustering metrics.
"""
# Inertia
results = [name, kmeans.inertia_]
# The silhouette score requires the full dataset
results += [
metrics.silhouette_score(data_scaled, kmeans.labels_,
metric="euclidean")
]
# Supervised metrics which require the true labels and cluster
# labels
clustering_metrics = [
metrics.homogeneity_score,
metrics.completeness_score,
metrics.v_measure_score,
]
results += [m(labels, kmeans.labels_) for m in clustering_metrics]
# Show the results
formatter_result = ("{:9s}\t{:.0f}\t{:.3f}\t{:.3f}\t{:.3f}\t{:.3f}")
print(formatter_result.format(*results))
# Aufrufen der Benchmark mit unserem trainierten kmeans und einer zufälligen Zuweisung (zum Vergleich)
print(82 * '_')
print('init\t\tinertia\tsil\thom\tcom\tv-meas')
# unser kmeans-Modell (zur Sicherheit neu trainieren)
kmeans = cluster.KMeans(n_clusters=3, n_init=10, random_state=0).fit(data_scaled)
bench_k_means(kmeans=kmeans, name="k-means_0", data=data_scaled, labels=wines["target"])
# unser kmeans-Modell (random_state 42)
kmeans = cluster.KMeans(n_clusters=3, n_init=10, random_state=42).fit(data_scaled)
bench_k_means(kmeans=kmeans, name="k-means_42", data=data_scaled, labels=wines["target"])
# unser kmeans-Modell (10x trainiert; das Modell mit der besten inertia gewinnt)
kmeans = cluster.KMeans(n_clusters=3, n_init=10).fit(data_scaled)
bench_k_means(kmeans=kmeans, name="k-means_opti", data=data_scaled, labels=wines["target"])
# zufällige Cluster-Zuordnung erzeugen
kmeans_rand = cluster.KMeans(init="random", n_init=10, n_clusters=3, random_state=0).fit(data_scaled)
bench_k_means(kmeans=kmeans_rand, name="random", data=data_scaled, labels=wines["target"])
print(82 * '_')
__________________________________________________________________________________
init inertia sil hom com v-meas
k-means_0 1278 0.285 0.879 0.873 0.876
k-means_42 1278 0.285 0.879 0.873 0.876
k-means_opti 1278 0.285 0.879 0.873 0.876
random 1278 0.285 0.879 0.873 0.876
__________________________________________________________________________________