text: # -*- coding: utf-8 -*-
  """
  Created on Sat Jun  5 00:24:23 2021
  
  @author: 34123
  """
  import matplotlib.pyplot as plt
  import numpy as np
  import random
  from scipy.stats import multivariate_normal
  
  
  def plot_random_init_iris_sepal(df_full):
      sepal_df = df_full.iloc[:,0:2]
      sepal_df = np.array(sepal_df)
      
      m1 = random.choice(sepal_df)
      m2 = random.choice(sepal_df)
      m3 = random.choice(sepal_df)
  
      cov1 = np.cov(np.transpose(sepal_df))
      cov2 = np.cov(np.transpose(sepal_df))
      cov3 = np.cov(np.transpose(sepal_df))
      
      x1 = np.linspace(4,8,150)  
      x2 = np.linspace(1.5,4.5,150)
      X, Y = np.meshgrid(x1,x2) 
  
      Z1 = multivariate_normal(m1, cov1)  
      Z2 = multivariate_normal(m2, cov2)
      Z3 = multivariate_normal(m3, cov3)
      
      # a new array of given shape and type, without initializing entries
      pos = np.empty(X.shape + (2,))
      pos[:, :, 0] = X; pos[:, :, 1] = Y   
  
      plt.figure(figsize=(10,10))
      plt.scatter(sepal_df[:,0], sepal_df[:,1], marker='o')     
      plt.contour(X, Y, Z1.pdf(pos), colors="r" ,alpha = 0.5) 
      plt.contour(X, Y, Z2.pdf(pos), colors="b" ,alpha = 0.5) 
      plt.contour(X, Y, Z3.pdf(pos), colors="g" ,alpha = 0.5)
      # making both the axis equal
      plt.axis('equal')                                                                 
      plt.xlabel('Sepal Length', fontsize=16)
      plt.ylabel('Sepal Width', fontsize=16)
      plt.title('Initial Random Clusters(Sepal)', fontsize=22)
      plt.grid()
      plt.show()
      
  
  def plot_random_init_iris_petal(df_full):
      petal_df = df_full.iloc[:,2:4]
      petal_df = np.array(petal_df)
      
      m1 = random.choice(petal_df)
      m2 = random.choice(petal_df)
      m3 = random.choice(petal_df)
      cov1 = np.cov(np.transpose(petal_df))
      cov2 = np.cov(np.transpose(petal_df))
      cov3 = np.cov(np.transpose(petal_df))
  
      x1 = np.linspace(-1,7,150)
      x2 = np.linspace(-1,4,150)
      X, Y = np.meshgrid(x1,x2) 
  
      Z1 = multivariate_normal(m1, cov1)  
      Z2 = multivariate_normal(m2, cov2)
      Z3 = multivariate_normal(m3, cov3)
  
      pos = np.empty(X.shape + (2,))
      pos[:, :, 0] = X; pos[:, :, 1] = Y   
  
      plt.figure(figsize=(10,10))
      plt.scatter(petal_df[:,0], petal_df[:,1], marker='o')     
      plt.contour(X, Y, Z1.pdf(pos), colors="r" ,alpha = 0.5) 
      plt.contour(X, Y, Z2.pdf(pos), colors="b" ,alpha = 0.5) 
      plt.contour(X, Y, Z3.pdf(pos), colors="g" ,alpha = 0.5) 
      plt.axis('equal') 
      plt.xlabel('Petal Length', fontsize=16) 
      plt.ylabel('Petal Width', fontsize=16)
      plt.title('Initial Random Clusters(Petal)', fontsize=22)
      plt.grid()
      plt.show()
      
      
  def plot_cluster_iris_sepal(df_full, labels, centers):
      # finding mode
      seto = max(set(labels[0:50]), key=labels[0:50].count) # 2
      vers = max(set(labels[50:100]), key=labels[50:100].count) # 1
      virg = max(set(labels[100:]), key=labels[100:].count) # 0
      
      # sepal
      s_mean_clus1 = np.array([centers[seto][0],centers[seto][1]])
      s_mean_clus2 = np.array([centers[vers][0],centers[vers][1]])
      s_mean_clus3 = np.array([centers[virg][0],centers[virg][1]])
      
      values = np.array(labels) #label
  
      # search all 3 species
      searchval_seto = seto
      searchval_vers = vers
      searchval_virg = virg
  
      # index of all 3 species
      ii_seto = np.where(values == searchval_seto)[0]
      ii_vers = np.where(values == searchval_vers)[0]
      ii_virg = np.where(values == searchval_virg)[0]
      ind_seto = list(ii_seto)
      ind_vers = list(ii_vers)
      ind_virg = list(ii_virg)
      
      sepal_df = df_full.iloc[:,0:2]
      
      seto_df = sepal_df[sepal_df.index.isin(ind_seto)]
      vers_df = sepal_df[sepal_df.index.isin(ind_vers)]
      virg_df = sepal_df[sepal_df.index.isin(ind_virg)]
      
      cov_seto = np.cov(np.transpose(np.array(seto_df)))
      cov_vers = np.cov(np.transpose(np.array(vers_df)))
      cov_virg = np.cov(np.transpose(np.array(virg_df)))
      
      sepal_df = np.array(sepal_df)
      
      x1 = np.linspace(4,8,150)  
      x2 = np.linspace(1.5,4.5,150)
      X, Y = np.meshgrid(x1,x2) 
  
      Z1 = multivariate_normal(s_mean_clus1, cov_seto)  
      Z2 = multivariate_normal(s_mean_clus2, cov_vers)
      Z3 = multivariate_normal(s_mean_clus3, cov_virg)
  
      pos = np.empty(X.shape + (2,))
      pos[:, :, 0] = X; pos[:, :, 1] = Y   
  
      plt.figure(figsize=(10,10))                                                          
      plt.scatter(sepal_df[:,0], sepal_df[:,1], marker='o')     
      plt.contour(X, Y, Z1.pdf(pos), colors="r" ,alpha = 0.5) 
      plt.contour(X, Y, Z2.pdf(pos), colors="b" ,alpha = 0.5) 
      plt.contour(X, Y, Z3.pdf(pos), colors="g" ,alpha = 0.5) 
      plt.axis('equal')                                                                  
      plt.xlabel('Sepal Length', fontsize=16)
      plt.ylabel('Sepal Width', fontsize=16)
      plt.title('Final Clusters(Sepal)', fontsize=22)  
      plt.grid()
      plt.show()
      
      
      
  def plot_cluster_iris_petal(df_full, labels, centers):
      # petal
      p_mean_clus1 = np.array([centers[seto][2],centers[seto][3]])
      p_mean_clus2 = np.array([centers[vers][2],centers[vers][3]])
      p_mean_clus3 = np.array([centers[virg][2],centers[virg][3]])
      
      petal_df = df_full.iloc[:,2:4]
      
      seto_df = petal_df[petal_df.index.isin(ind_seto)]
      vers_df = petal_df[petal_df.index.isin(ind_vers)]
      virg_df = petal_df[petal_df.index.isin(ind_virg)]
      
      cov_seto = np.cov(np.transpose(np.array(seto_df)))
      cov_vers = np.cov(np.transpose(np.array(vers_df)))
      cov_virg = np.cov(np.transpose(np.array(virg_df)))
      
      petal_df = np.array(petal_df) 
      
      x1 = np.linspace(0.5,7,150)  
      x2 = np.linspace(-1,4,150)
      X, Y = np.meshgrid(x1,x2) 
  
      Z1 = multivariate_normal(p_mean_clus1, cov_seto)  
      Z2 = multivariate_normal(p_mean_clus2, cov_vers)
      Z3 = multivariate_normal(p_mean_clus3, cov_virg)
  
      pos = np.empty(X.shape + (2,))
      pos[:, :, 0] = X; pos[:, :, 1] = Y   
  
      plt.figure(figsize=(10,10))                                                         
      plt.scatter(petal_df[:,0], petal_df[:,1], marker='o')     
      plt.contour(X, Y, Z1.pdf(pos), colors="r" ,alpha = 0.5) 
      plt.contour(X, Y, Z2.pdf(pos), colors="b" ,alpha = 0.5) 
      plt.contour(X, Y, Z3.pdf(pos), colors="g" ,alpha = 0.5) 
      plt.axis('equal')                                               
      plt.xlabel('Petal Length', fontsize=16)
      plt.ylabel('Petal Width', fontsize=16)
      plt.title('Final Clusters(Petal)', fontsize=22)
      plt.grid()
      plt.show()
  