Algoritmi di clustering - Clustering gerarchico
Introduzione al clustering gerarchico
Il clustering gerarchico è un altro algoritmo di apprendimento non supervisionato che viene utilizzato per raggruppare i punti dati senza etichetta aventi caratteristiche simili. Gli algoritmi di clustering gerarchico rientrano nelle seguenti due categorie:
Agglomerative hierarchical algorithms- Negli algoritmi gerarchici agglomerativi, ogni punto di dati viene trattato come un singolo cluster e successivamente unire o agglomerare (approccio bottom-up) le coppie di cluster. La gerarchia dei cluster è rappresentata come un dendrogramma o una struttura ad albero.
Divisive hierarchical algorithms - D'altra parte, negli algoritmi gerarchici divisivi, tutti i punti dati sono trattati come un grande cluster e il processo di clustering implica la divisione (approccio Top-down) dell'unico grande cluster in vari piccoli cluster.
Passaggi per eseguire il clustering gerarchico agglomerativo
Spiegheremo il clustering Gerarchico più utilizzato e importante, ovvero l'agglomerato. I passaggi per eseguire lo stesso sono i seguenti:
Step 1- Tratta ogni punto dati come un singolo cluster. Quindi, avremo, diciamo K cluster all'inizio. Anche il numero di punti dati sarà K all'inizio.
Step 2- Ora, in questo passaggio, dobbiamo formare un grande cluster unendo due datapoint dell'armadio. Ciò si tradurrà in un totale di cluster K-1.
Step 3- Ora, per formare più cluster dobbiamo unire due cluster di armadio. Ciò si tradurrà in un totale di cluster K-2.
Step 4 - Ora, per formare un grande cluster, ripetere i tre passaggi precedenti fino a quando K diventa 0, ovvero non sono rimasti più punti dati da unire.
Step 5 - Alla fine, dopo aver creato un unico grande cluster, i dendrogrammi verranno utilizzati per suddividersi in più cluster a seconda del problema.
Ruolo dei dendrogrammi nel raggruppamento gerarchico agglomerativo
Come abbiamo discusso nell'ultimo passaggio, il ruolo del dendrogramma inizia una volta formato il grande ammasso. Il dendrogramma verrà utilizzato per dividere i cluster in più cluster di punti dati correlati a seconda del nostro problema. Può essere compreso con l'aiuto del seguente esempio:
Esempio 1
Per capire, iniziamo con l'importazione delle librerie richieste come segue:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
Successivamente, tracceremo i punti dati che abbiamo preso per questo esempio:
X = np.array([[7,8],[12,20],[17,19],[26,15],[32,37],[87,75],[73,85], [62,80],[73,60],[87,96],])
labels = range(1, 11)
plt.figure(figsize=(10, 7))
plt.subplots_adjust(bottom=0.1)
plt.scatter(X[:,0],X[:,1], label='True Position')
for label, x, y in zip(labels, X[:, 0], X[:, 1]):
plt.annotate(label,xy=(x, y), xytext=(-3, 3),textcoords='offset points', ha='right', va='bottom')
plt.show()
Dal diagramma sopra, è molto facile vedere che abbiamo due cluster in out datapoint, ma nei dati del mondo reale possono esserci migliaia di cluster. Successivamente, tracceremo i dendrogrammi dei nostri punti dati utilizzando la libreria Scipy -
from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
linked = linkage(X, 'single')
labelList = range(1, 11)
plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top',labels=labelList, distance_sort='descending',show_leaf_counts=True)
plt.show()
Ora, una volta formato il grande ammasso, viene selezionata la distanza verticale più lunga. Viene quindi tracciata una linea verticale come mostrato nel diagramma seguente. Poiché la linea orizzontale attraversa la linea blu in due punti, il numero di cluster sarebbe due.
Successivamente, dobbiamo importare la classe per il clustering e chiamare il suo metodo fit_predict per prevedere il cluster. Stiamo importando la classe AgglomerativeClustering della libreria sklearn.cluster -
from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(X)
Quindi, traccia il cluster con l'aiuto del seguente codice:
plt.scatter(X[:,0],X[:,1], c=cluster.labels_, cmap='rainbow')
Il diagramma sopra mostra i due cluster dai nostri datapoint.
Esempio 2
Poiché abbiamo compreso il concetto di dendrogrammi dal semplice esempio discusso sopra, passiamo a un altro esempio in cui stiamo creando cluster del punto dati nel set di dati del diabete indiano Pima utilizzando il clustering gerarchico:
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import numpy as np
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
data.shape
(768, 9)
data.head()
slno. | preg | Plas | Pres | pelle | test | massa | pedi | età | classe |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
patient_data = data.iloc[:, 3:5].values
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7))
plt.title("Patient Dendograms")
dend = shc.dendrogram(shc.linkage(data, method='ward'))
from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
cluster.fit_predict(patient_data)
plt.figure(figsize=(10, 7))
plt.scatter(patient_data[:,0], patient_data[:,1], c=cluster.labels_, cmap='rainbow')