<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1. Clusterização Hierárquica
Step1:  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.
Step2:  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
Step3:  É 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
Step4:  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
Step5:  Os dados parecem estar agrupados corretamente? Tente fazer o mesmo procedimento com algoritmo de clusterização hieráquica 
https
Step6:  Mostre e análise o dendrograma do exemplo acima.
Step7:  Qual a sua conclusão?
"Escreva aqui"
1.4 Exemplo 2 - Noisy Circles
Step8:  Utilize o algoritmo do K-means para separa os conjuntos.
Step9:  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.
Step10:  Mostre e análise o dendrograma do exemplo acima.
Step11:  Qual a sua conclusão?
"Escreva aqui"
2. DBSCAN
Step12:  Clusterize os dados usando clusterização Hierárquica
Step13:  Clusterize os dados usando o algoritmo DBSCAN.
https
<ASSISTANT_TASK:>
Python Code:
# 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
# Scikit Learning hierarchical clustering
from sklearn.cluster import AgglomerativeClustering
# SciPy hierarchical clustering
from scipy.cluster import hierarchy
Explanation: 1. Clusterização Hierárquica
End of explanation
# 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()
# 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()
Explanation: 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.
End of explanation
# 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)
Explanation: 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).
End of explanation
# 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()
Explanation: É 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.
End of explanation
import nbimporter
from Notebook_KMeans import KMeans
### CODE HERE ###
Explanation: 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
End of explanation
### CODE HERE ###
Explanation: 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
End of explanation
### CODE HERE ###
Explanation: Mostre e análise o dendrograma do exemplo acima.
End of explanation
# 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()
Explanation: Qual a sua conclusão?
"Escreva aqui"
1.4 Exemplo 2 - Noisy Circles
End of explanation
### CODE HERE ###
Explanation: Utilize o algoritmo do K-means para separa os conjuntos.
End of explanation
### CODE HERE ###
Explanation: 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.
End of explanation
### CODE HERE ###
Explanation: Mostre e análise o dendrograma do exemplo acima.
End of explanation
# 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()
Explanation: Qual a sua conclusão?
"Escreva aqui"
2. DBSCAN
End of explanation
### CODE HERE ###
Explanation: Clusterize os dados usando clusterização Hierárquica
End of explanation
### CODE HERE ###
Explanation: Clusterize os dados usando o algoritmo DBSCAN.
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html
End of explanation
<END_TASK>