1. Clusterização Hierárquica


In [1]:
# import libraries

# linear algebra
import numpy as np 
# data processing
import pandas as pd 
# library of math
import math
# data visualization
from matplotlib import pyplot as plt 
# datasets
from sklearn import datasets

In [2]:
# Scikit Learning hierarchical clustering
from sklearn.cluster import AgglomerativeClustering
# SciPy hierarchical clustering
from scipy.cluster import hierarchy

1.1 Clusterização Hierárquica

Verifique abaixo o resultado da clusterização hierárquica variando a quantidade de clusters de forma iterativa. Teste também outras funções de ligação (linkage).

Fique livre parar alterar ou criar novos dados no dataset de exemplo abaixo.


In [3]:
# Dataset
tmp_data = np.array([[1,1],[2,2],[2,3],[4,4],
                     [4,2],[6,6],[10,9],[7,7],
                     [8,8],[7,9],[10,10],[14,2]])

plt.scatter(tmp_data[:,0], tmp_data[:,1], s=150)
plt.show()



In [4]:
# Teste diferentes funções de ligações
# {“ward”, “complete”, “average”}
linkage = 'ward'

# Clusterização hierárquica
ag_model = AgglomerativeClustering(linkage=linkage)

# Número de colunas do plot
plot_col = 3

n_rows, n_col = tmp_data.shape
fig, ax = plt.subplots(nrows=math.ceil(len(tmp_data)/plot_col), 
                       ncols=plot_col,figsize=(20,20))

count = 0
for n_clusters in range(len(tmp_data),0,-1):
    index = abs(n_clusters - len(tmp_data))
    
    # Atribui o número de clusters
    ag_model.n_clusters = n_clusters
    # Ajusta o modelo
    ag_model = ag_model.fit(tmp_data)
    
    if plot_col == 1:
        ax[count].scatter(tmp_data[:,0], tmp_data[:,1], c=ag_model.labels_, s=150)
        ax[count].set_title("Qt. Clusters: " + str(n_clusters))
    else:
        ax[count, (index)%plot_col].scatter(tmp_data[:,0], tmp_data[:,1], c=ag_model.labels_, s=150)
        ax[count, (index)%plot_col].set_title("Qt. Clusters: " + str(n_clusters))
    
    if (index+1) % plot_col == 0:
        count += 1     
        
plt.show()


1.2 Dendrograma

Um dendrograma é um tipo de diagrama de árvore que mostra o relacionamentos entre conjuntos de dados semelhantes, ou agrupamento hierárquico. Eles são freqüentemente usados em biologia para mostrar o agrupamento entre genes ou amostras, mas podem representar qualquer tipo de dados agrupados.

https://www.statisticshowto.datasciencecentral.com/hierarchical-clustering/

Utilize o código abaixo para criar os Dendrogramas dos dados utilizados nas células acima. Fique livre para retornar e testar outras distribuições dos dados e funções de ligamento (linkage).


In [5]:
# Usa o método de linkage especificado 
# para construir o dendrograma
if (linkage == 'average'):
    Z = hierarchy.average(tmp_data)
elif (linkage == 'complete'):
    Z = hierarchy.complete(tmp_data)
elif (linkage == 'ward'):
    Z = hierarchy.ward(tmp_data)

plt.figure()
plt.title("Dendrograma - linkage: " + str(linkage))
dn = hierarchy.dendrogram(Z)


É possível fazer um teste de permutação para validar o número de clusters escolhidos, ou seja, verificar se realmente existe uma tendência não aleatória para os objetos se agruparem.

A técnica envolve testes estatísticos e pode ser estudado pelo material a seguir: http://www.econ.upf.edu/~michael/stanford/maeb7.pdf

1.3 Exemplo 1 - Bolhas com diferentes variâncias

Observe a distribuição do dataset abaixo.


In [6]:
# blobs with varied variances
n_samples = 1500
random_state = 170
varied = datasets.make_blobs(n_samples=n_samples,
                             cluster_std=[1.0, 2.5, 0.5],
                             random_state=random_state)
dataset_varied = varied[0]

plt.scatter(dataset_varied[:,0], dataset_varied[:,1])
plt.show()


Utilize o algoritmo do K-means para separa os conjuntos.

Você pode importar o K-means criado por você! Para importar uma função de um notebook para outro instale a biblioteca nbimporter:

  • pip install nbimporter

In [7]:
import nbimporter
from Notebook_KMeans import KMeans


Importing Jupyter notebook from Notebook_KMeans.ipynb

In [1]:
### CODE HERE ###

Os dados parecem estar agrupados corretamente? Tente fazer o mesmo procedimento com algoritmo de clusterização hieráquica

https://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html


In [2]:
### CODE HERE ###

Mostre e análise o dendrograma do exemplo acima.


In [3]:
### CODE HERE ###

Qual a sua conclusão?

"Escreva aqui"

1.4 Exemplo 2 - Noisy Circles


In [11]:
# Gerar o conjunto de dados
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=.5,
                                      noise=.05)
dataset_circles = noisy_circles[0]

# Mostrar os dados
plt.scatter(dataset_circles[:,0], dataset_circles[:,1])
plt.show()


Utilize o algoritmo do K-means para separa os conjuntos.


In [4]:
### CODE HERE ###

Os dados parecem estar agrupados corretamente? Tente fazer o mesmo procedimento com algoritmo de clusterização hieráquica, altera os parâmetros se for necessário.


In [7]:
### CODE HERE ###

Mostre e análise o dendrograma do exemplo acima.


In [8]:
### CODE HERE ###

Qual a sua conclusão?

"Escreva aqui"

2. DBSCAN


In [16]:
# Anisotropicly distributed data
random_state = 170
X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)
transformation = [[0.6, -0.6], [-0.4, 0.8]]
dataset = np.dot(X, transformation)

# Mostrar os dados
plt.scatter(dataset[:,0], dataset[:,1])
plt.show()


Clusterize os dados usando clusterização Hierárquica


In [9]:
### CODE HERE ###

In [18]:
### CODE HERE ###

Qual a sua conclusão?

"Escreva aqui"