"""=========================================================K-means Clustering=========================================================The plots display firstly what a K-means algorithm would yieldusing three clusters. It is then shown what the effect of a badinitialization is on the classification process:By setting n_init to only 1 (default is 10), the amount oftimes that the algorithm will be run with different centroidseeds is reduced.The next plot displays what using eight clusters would deliverand finally the ground truth."""print(__doc__)# Code source: Gaël Varoquaux# Modified for documentation by Jaques Grobler# License: BSD 3 clauseimport numpy as npimport matplotlib.pyplot as plt# Though the following import is not directly being used, it is required# for 3D projection to workfrom mpl_toolkits.mplot3d import Axes3Dfrom sklearn.cluster import KMeansfrom sklearn import datasetsnp.random.seed(5)iris = datasets.load_iris()X = iris.datay = iris.targetestimators = [('k_means_iris_8',KMeans(n_clusters=8)), ('k_means_iris_3',KMeans(n_clusters=3)), ('k_means_iris_bad_init',KMeans(n_clusters=3, n_init=1, init='random'))]fignum =1titles = ['8 clusters','3 clusters','3 clusters, bad initialization']for name, est in estimators: fig = plt.figure(fignum, figsize=(4, 3)) ax =Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134) est.fit(X) labels = est.labels_ ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float), edgecolor='k') ax.w_xaxis.set_ticklabels([]) ax.w_yaxis.set_ticklabels([]) ax.w_zaxis.set_ticklabels([]) ax.set_xlabel('Petal width') ax.set_ylabel('Sepal length') ax.set_zlabel('Petal length') ax.set_title(titles[fignum -1]) ax.dist =12 fignum = fignum +1# Plot the ground truthfig = plt.figure(fignum, figsize=(4, 3))ax =Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)for name, label in [('Setosa',0), ('Versicolour',1), ('Virginica',2)]: ax.text3D(X[y == label, 3].mean(), X[y == label, 0].mean(), X[y == label, 2].mean() +2, name, horizontalalignment='center', bbox=dict(alpha=.2, edgecolor='w', facecolor='w'))# Reorder the labels to have colors matching the cluster resultsy = np.choose(y, [1, 2, 0]).astype(np.float)ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor='k')ax.w_xaxis.set_ticklabels([])ax.w_yaxis.set_ticklabels([])ax.w_zaxis.set_ticklabels([])ax.set_xlabel('Petal width')ax.set_ylabel('Sepal length')ax.set_zlabel('Petal length')ax.set_title('Ground Truth')ax.dist =12fig.show()