60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
"""
|
|
Aufgabe: k-means classifier verwenden um cluster im iris datenset zu finden und aufgrund von features Klassen von Samples predicten
|
|
|
|
Erkenntnis aus dieser Aufgabe
|
|
- der k-means Algorithmus ist nicht perfekt für diese Art von Daten geeignet
|
|
- wahrscheinlich weil die Cluster geometrisch zu wenig kugelförmig sind
|
|
"""
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
from sklearn.decomposition import PCA
|
|
from sklearn import datasets
|
|
from sklearn.cluster import KMeans
|
|
from sklearn import metrics
|
|
|
|
# iris datenset laden
|
|
iris = datasets.load_iris()
|
|
|
|
# print 150 samples
|
|
print(iris.target)
|
|
|
|
"""
|
|
Egal wie die parameter gewählt werden, die metriken sind nicht sehr gut.
|
|
"""
|
|
# kmeans = KMeans(n_clusters=3, init="random", n_init=1)
|
|
# kmeans = KMeans(n_clusters=3, init='random', n_init=50)
|
|
# kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10)
|
|
kmeans = KMeans(n_clusters=3)
|
|
|
|
# fit auf daten
|
|
kmeans.fit(iris.data)
|
|
|
|
# Gegenüberstellung gold standard vs prediction
|
|
print("gold standard vs. prediction")
|
|
for target_label, predicted_label in zip(iris.target, kmeans.labels_):
|
|
print(f"{target_label} -> {predicted_label}")
|
|
|
|
# ausgeben aller relevanten metriken
|
|
print(metrics.homogeneity_score(iris.target, kmeans.labels_))
|
|
print(metrics.completeness_score(iris.target, kmeans.labels_))
|
|
print(metrics.adjusted_rand_score(iris.target, kmeans.labels_))
|
|
print(metrics.silhouette_score(iris.data, kmeans.labels_))
|
|
|
|
# plot vorbereiten (Idee von kmeans digits)
|
|
# Transformation 4D nach 2D via Projektionsfit
|
|
pca = PCA(n_components=2)
|
|
X2d = pca.fit_transform(iris.data)
|
|
centroids2d = pca.transform(kmeans.cluster_centers_)
|
|
|
|
# plotten der Punktewolke und einzeichnen der Centroiden
|
|
plt.scatter(X2d[:, 0], X2d[:, 1], c=kmeans.labels_, cmap="viridis", s=30, alpha=0.7)
|
|
plt.scatter(
|
|
centroids2d[:, 0], centroids2d[:, 1], c="red", marker="X", s=200, edgecolors="black"
|
|
)
|
|
plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%} var)")
|
|
plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%} var)")
|
|
plt.title("K-Means on Iris (PCA projection)")
|
|
plt.colorbar(label="Cluster")
|
|
plt.savefig("kmeans_iris.png", dpi=150)
|