import matplotlib.pyplot as plt

from sklearn import datasets

from sklearn.cluster import KMeans

import sklearn.metrics as sm

import pandas as pd

import numpy as np

#import matplotlib inline


iris = datasets.load_iris()


X = pd.DataFrame(iris.data)

X.columns = ['Sepal_Length','Sepal_Width','Petal_Length','Petal_Width']


y = pd.DataFrame(iris.target)

y.columns = ['Targets']


#colormap = np.array(['red', 'lime', 'black'])


# K Means Cluster

model = KMeans(n_clusters=3)

model.fit(X)

# This is what KMeans thought

model.labels_


# View the results


# Set the size of the plot

plt.figure(figsize=(14,7))


# Create a colormap

colormap = np.array(['red', 'lime', 'black'])


# Plot the Original Classifications

plt.subplot(1, 2, 1)

plt.scatter(X.Petal_Length, X.Petal_Width, c=colormap[y.Targets], s=40)

plt.title('Real Classification')


# Plot the Models Classifications

plt.subplot(1, 2, 2)

plt.scatter(X.Petal_Length, X.Petal_Width, c=colormap[model.labels_], s=40)

plt.title('K Mean Classification')


# View the results

# Set the size of the plot

plt.figure(figsize=(14,7))

# Create a colormap

#print('The accuracy score : ',sm.accuracy_score(y, model.labels_))

#sm.confusion_matrix(y, model.labels_)


predY = np.choose(model.labels_, [0, 1, 2]).astype(np.int64)

print (predY)


#colormap = np.array(['red', 'lime', 'black'])

# Plot Orginal

plt.subplot(1, 2, 1)

plt.scatter(X.Petal_Length, X.Petal_Width, c=colormap[y.Targets], s=40)

plt.title('Real Classification')

# Plot Predicted with corrected values

plt.subplot(1, 2, 2)

plt.scatter(X.Petal_Length,X.Petal_Width, c=colormap[predY], s=40)

plt.title('K Mean Classification')


print('The accuracy score of K-Mean: ',sm.accuracy_score(y, model.labels_))

print('The Confusion matrixof K-Mean: ',sm.confusion_matrix(y, model.labels_))


from sklearn import preprocessing

scaler = preprocessing.StandardScaler()

scaler.fit(X)

xsa = scaler.transform(X)

xs = pd.DataFrame(xsa, columns = X.columns)

#xs.sample(5)


from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3)

gmm.fit(xs)


y_cluster_gmm = gmm.predict(xs)

#y_cluster_gmm


plt.subplot(2, 2, 3)

plt.scatter(X.Petal_Length, X.Petal_Width, c=colormap[y_cluster_gmm], s=40)

plt.title('GMM Classification')


print('The accuracy score of EM: ',sm.accuracy_score(y, y_cluster_gmm))

print('The Confusion matrix of EM: ',sm.confusion_matrix(y, y_cluster_gmm))