# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     name: python3
# ---

# + [markdown] id="D1b4842kvpyr" colab_type="text"
#
# # **<center>Aprendizagem de Máquina**
# ### <center> Algoritmo Kmeans 

# + [markdown] id="95XW-MLBu1fw" colab_type="text"
# Usando o algoritmo kmeans para agrupar os 8 seguintes exemplos em 3 clusters:
#
#     A1 = (2,10), A2 = (2,5), A3 = (8,4), A4 = (5,8), A5 = (7,5), A6 = (6,4), A7 = (1,2), A8 = (4,9)
#
# Suponha-se que as sementes iniciais (centros de cada grupo), são: A1, A4 e A7. 
#
#

# + [markdown] id="qMe7Pw0Inxu-" colab_type="text"
# #### Importação das Bibiotecas Utilizadas

# + id="CLBh-WXuXoYr" colab_type="code" colab={}
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

# + [markdown] id="syNhuEj_nwv-" colab_type="text"
# #### Declaração dos pontos na forma de numpy.array

# + id="LEjmTuMoXsiX" colab_type="code" colab={}
a = np.array([[2, 10], [2, 5], [8, 4], [5, 8],[7, 5], [6, 4], [1, 2], [4, 9]])
seed = np.array([[2, 10], [5, 8], [1, 2]])


# + [markdown] id="vVMIETRRnzFd" colab_type="text"
# #### Funções de pipeline

# + id="JvOoRxCsX7Oz" colab_type="code" colab={}
def plot_cluster(a_array, color, title, subplot):
  plt.subplot(subplot)
  plt.scatter(a_array[:,0], a_array[:,1], c=color)
  plt.title(title)
  plt.xlabel("x") 
  plt.ylabel("y")
  plt.xlim(-1,12) 
  plt.ylim(-1,12)


# + id="YHrAHclXaFDH" colab_type="code" colab={}
def pipeline_clustering(features, clusters, seeds, iter):
  km = KMeans(clusters, seeds, max_iter=iter)
  model = km.fit(features)
  return model


# + [markdown] id="SV-7TbXAn0-Y" colab_type="text"
# #### Visualização do Conjunto de Dados

# + id="bvaSQW8YgThS" colab_type="code" outputId="4ac7cfa6-1d3f-4a8c-fd94-96794f783ea0" colab={"base_uri": "https://localhost:8080/", "height": 295}
plot_cluster(a, 'blue', 'Conjunto de Dados', 111)

# + [markdown] id="YR8xXzzZQR-2" colab_type="text"
# #### Determinação do número de clusters utilizando o metodo elbow
#      Usando a medida de inércia que corresponde ao somatório dos erros quadráticos das instâncias de cada cluster.

# + id="1uHSEAgwJHbi" colab_type="code" colab={}
# k means determine k
inercia = []
K = range(1,9)
for k in K:
    kmeanModel = KMeans(n_clusters=k).fit(a)
    inercia.append(kmeanModel.inertia_) 

# + id="4xNetcVGJSvY" colab_type="code" outputId="ebc7d5ba-04df-4cd5-cf20-de574f9ef56e" colab={"base_uri": "https://localhost:8080/", "height": 295}
plt.plot(K, inercia, 'x-') 
plt.xlabel('Valores de k') 
plt.ylabel('Inercia') 
plt.title('O metodo Elbow usando Inercia') 
plt.show() 

# + id="7KjTlPlZOx70" colab_type="code" colab={"base_uri": "https://localhost:8080/", "height": 151} outputId="0f684884-4030-4d92-dfa4-3888c2c5bb90"
a = [print(x) for x in inercia]

# + [markdown] id="DesTMXtUn2zU" colab_type="text"
# #### Treino do Modelo com apenas uma iteração do Algoritmo

# + id="YKKeW0SAhd3A" colab_type="code" outputId="73b1899b-1d2d-4aa8-e57f-958c700b5df5" colab={"base_uri": "https://localhost:8080/", "height": 70}
km_1 = pipeline_clustering(a, 3, seed, 1)

# + [markdown] id="O0kzVYE3n7FX" colab_type="text"
# #### Centroides formados em uma iteração

# + id="AJhN2uP1h7Mm" colab_type="code" outputId="95be646f-43ae-462f-a4da-5a52ac30d182" colab={"base_uri": "https://localhost:8080/", "height": 67}
centroid_1 = km_1.cluster_centers_
print("")
print("Os centróides encontrados para uma iteração foram: ")

for i, _ in enumerate(centroid_1):
  print(" {} - ".format(centroid_1[i]), end="")

# + [markdown] id="UOsrwdp8n9j-" colab_type="text"
# #### Visualização dos Agrupamentos e Centroides 

# + id="7Rtmkyw6qqpz" colab_type="code" outputId="ba8de48b-435b-4e61-e3e5-02caf1311352" colab={"base_uri": "https://localhost:8080/", "height": 241}
plt.figure(figsize=(15, 3))

plot_cluster(a, km_1.labels_, "Agrupamentos para uma Iteração", 131)

plot_cluster(centroid_1, 'red', 'Centroides para uma Iteração', 132)

plot_cluster(a, km_1.labels_, "Visualização dos Agrupamentos e Centroides - Uma Iteração", 133)
plt.scatter(centroid_1[:, 0], centroid_1[:, 1], c='red', s=200, alpha=0.4)
plt.show()

# + [markdown] id="J1ymoxZUn_DD" colab_type="text"
# #### Treinamento do Algoritmo até a Convergencia
#
#
# Parâmetros 
#
#     n_clusters : 3
#     init : ndarray (sementes inicias)
#     max_iter : padrão (300)

# + id="os1VDYv4LhsO" colab_type="code" outputId="64976336-4704-4d90-9620-a0cf1c35535c" colab={"base_uri": "https://localhost:8080/", "height": 70}
km = KMeans(3, init=seed).fit(a)

# + [markdown] id="gODlaZGMoAbh" colab_type="text"
# #### Centróides Formados 

# + id="lf_L7ffP31eb" colab_type="code" outputId="ed08aa11-be42-4890-883d-a12634c894c8" colab={"base_uri": "https://localhost:8080/", "height": 84}
centroid = km.cluster_centers_
iterac = km.n_iter_

print("Foram necessárias {} iterações para o algoritmo convergir.".format(iterac))
print("")
print("Os centróides encontrados foram: ")

for i, _ in enumerate(centroid):
  print(" {} - ".format(centroid[i]), end="")

# + [markdown] id="X2UsT97noCuz" colab_type="text"
# #### Visualização dos Agrupamentos e Centróides com algoritmo Convergido

# + id="aFb3XP3A3WIO" colab_type="code" outputId="c6c46f31-c789-4e52-fe5e-2f10da941cf5" colab={"base_uri": "https://localhost:8080/", "height": 241}
plt.figure(figsize=(15, 3))

plot_cluster(a, km.labels_, "Agrupamentos até o Algoritmo Convergir", 131)

plot_cluster(centroid, 'red', 'Centróides', 132)

plot_cluster(a, km.labels_, "Agrupamentos e Centróides", 133)
plt.scatter(centroid[:, 0], centroid[:, 1], c='red', s=200, alpha=0.4)

plt.show()

# + [markdown] id="5-U9iWrzoEEl" colab_type="text"
# #### Visualização das Regiões de Fronteira com Diagrama de Voronoi

# + id="41iJSKVfSSqA" colab_type="code" colab={}
from scipy.spatial import Voronoi, voronoi_plot_2d
vor = Voronoi(centroid)

# + id="XNJQjfcQSW97" colab_type="code" outputId="b5639b12-678b-4c43-a93d-04c63484d8af" colab={"base_uri": "https://localhost:8080/", "height": 349}
fig = voronoi_plot_2d(vor)
plot_cluster(a, km.labels_, "Agrupamentos e Região de Voronoi", 111)
plt.show()

# + [markdown] id="IV9uUtxhAUwn" colab_type="text"
# Link para o Notebook: https://colab.research.google.com/drive/1oR0SZHLJTWuIslET0jKdoo8SkEO7PR09

StarcoderdataJupyterScriptsDedupFiltered