""" 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)