La agrupació jeràrquica és un altre algorisme d'aprenentatge automàtic no supervisat, que s'utilitza per agrupar els conjunts de dades sense etiquetar en un clúster i també conegut com anàlisi de clúster jeràrquic o HCA.
En aquest algorisme, desenvolupem la jerarquia de clústers en forma d'arbre, i aquesta estructura en forma d'arbre es coneix com a dendrograma .
De vegades, els resultats de la agrupació K-means i la agrupació jeràrquica poden semblar similars, però tots dos difereixen segons com funcionin. Com que no hi ha cap requisit per predeterminar el nombre de clústers com vam fer a l'algorisme K-Means.
La tècnica de agrupació jeràrquica té dos enfocaments:
Per què agrupació jeràrquica?
Com ja en tenim d'altres agrupació algorismes com ara K-Means Clustering , llavors per què necessitem agrupacions jeràrquiques? Així, com hem vist en el clustering K-means, hi ha alguns reptes amb aquest algorisme, que són un nombre predeterminat de clústers, i sempre intenta crear els clústers de la mateixa mida. Per resoldre aquests dos reptes, podem optar per l'algorisme de clúster jeràrquic perquè, en aquest algorisme, no necessitem tenir coneixements sobre el nombre predefinit de clústers.
En aquest tema, parlarem de l'algorisme de agrupació jeràrquica aglomerativa.
Aglomeració jeràrquica aglomerativa
L'algorisme de agrupació jeràrquica aglomerativa és un exemple popular d'HCA. Per agrupar els conjunts de dades en clústers, segueix el enfocament de baix a dalt . Vol dir que aquest algorisme considera cada conjunt de dades com un únic clúster al principi i després comença a combinar el parell de clústers més proper. Ho fa fins que tots els clústers es fusionen en un únic clúster que conté tots els conjunts de dades.
Aquesta jerarquia de clústers es representa en forma de dendrograma.
Com funciona el clustering jeràrquic aglomeratiu?
El funcionament de l'algorisme AHC es pot explicar mitjançant els passos següents:
instanciació en java
Nota: per entendre millor la agrupació jeràrquica, es recomana fer una ullada a la agrupació de k-means
Mesura de la distància entre dos cúmuls
Com hem vist, el distància més propera entre els dos clústers és crucial per a la agrupació jeràrquica. Hi ha diverses maneres de calcular la distància entre dos clústers, i aquestes maneres decideixen la regla d'agrupació. Aquestes mesures s'anomenen Mètodes d'enllaç . Alguns dels mètodes d'enllaç populars es mostren a continuació:
A partir dels plantejaments anteriors, podem aplicar-ne qualsevol segons el tipus de problema o requisit empresarial.
Elaboració de Dendrogram en agrupació jeràrquica
El dendrograma és una estructura en forma d'arbre que s'utilitza principalment per emmagatzemar cada pas com a memòria que realitza l'algorisme HC. A la trama del dendrograma, l'eix Y mostra les distàncies euclidianes entre els punts de dades i l'eix X mostra tots els punts de dades del conjunt de dades donat.
El funcionament del dendrograma es pot explicar mitjançant el diagrama següent:
Al diagrama anterior, la part esquerra mostra com es creen els clústers en agrupacions aglomeratives, i la part dreta mostra el dendrograma corresponent.
- Com hem comentat anteriorment, en primer lloc, els punts de dades P2 i P3 es combinen i formen un clúster, corresponentment es crea un dendrograma, que connecta P2 i P3 amb una forma rectangular. L'alçada es decideix segons la distància euclidiana entre els punts de dades.
- En el següent pas, P5 i P6 formen un clúster i es crea el dendrograma corresponent. És superior a l'anterior, ja que la distància euclidiana entre P5 i P6 és una mica més gran que la P2 i P3.
- De nou, es creen dos nous dendrogrames que combinen P1, P2 i P3 en un dendrograma, i P4, P5 i P6, en un altre dendrograma.
- Finalment, es crea el dendrograma final que combina tots els punts de dades junts.
Podem tallar l'estructura de l'arbre del dendrograma a qualsevol nivell segons el nostre requisit.
Implementació de Python de clúster jeràrquic aglomeratiu
Ara veurem la implementació pràctica de l'algorisme de agrupació jeràrquica aglomerativa utilitzant Python. Per implementar-ho, utilitzarem el mateix problema de conjunt de dades que hem utilitzat en el tema anterior de agrupació de K-means de manera que puguem comparar ambdós conceptes fàcilment.
El conjunt de dades conté la informació dels clients que han visitat un centre comercial per comprar. Per tant, el propietari del centre comercial vol trobar alguns patrons o algun comportament particular dels seus clients mitjançant la informació del conjunt de dades.
Passos per a la implementació d'AHC mitjançant Python:
Els passos per a la implementació seran els mateixos que els de la agrupació k-means, excepte alguns canvis com el mètode per trobar el nombre de clústers. A continuació es mostren els passos:
Passos de preprocessament de dades:
En aquest pas, importarem les biblioteques i els conjunts de dades del nostre model.
# Importing the libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
Les línies de codi anteriors s'utilitzen per importar les biblioteques per realitzar tasques específiques, com ara numpy per a les operacions matemàtiques, matplotlib per dibuixar els gràfics o el diagrama de dispersió, i pandes per importar el conjunt de dades.
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
Com hem comentat anteriorment, hem importat el mateix conjunt de dades de Mall_Customers_data.csv, com vam fer a l'agrupament de k-means. Considereu la sortida següent:
Aquí extreurem només la matriu de característiques ja que no tenim més informació sobre la variable dependent. El codi es mostra a continuació:
instanciació en java
x = dataset.iloc[:, [3, 4]].values
Aquí només hem extret 3 i 4 columnes, ja que utilitzarem una gràfica 2D per veure els clústers. Per tant, estem considerant la puntuació anual d'ingressos i despeses com a matriu de característiques.
Pas 2: Trobar el nombre òptim de clústers mitjançant el Dendrograma
Ara trobarem el nombre òptim de clústers utilitzant el Dendrograma per al nostre model. Per a això, farem servir scipy biblioteca ja que proporciona una funció que retornarà directament el dendrograma del nostre codi. Considereu les següents línies de codi:
#Finding the optimal number of clusters using the dendrogram import scipy.cluster.hierarchy as shc dendro = shc.dendrogram(shc.linkage(x, method='ward')) mtp.title('Dendrogrma Plot') mtp.ylabel('Euclidean Distances') mtp.xlabel('Customers') mtp.show()
A les línies de codi anteriors, hem importat el fitxer jerarquia mòdul de la biblioteca scipy. Aquest mòdul ens proporciona un mètode shc.denrogram(), que pren el enllaç () com a paràmetre. La funció d'enllaç s'utilitza per definir la distància entre dos clústers, així que aquí hem passat la x (matriu de característiques) i el mètode ' barri ,' el popular mètode d'enllaç en agrupació jeràrquica.
Les línies de codi restants són per descriure les etiquetes de la trama del dendrograma.
Sortida:
En executar les línies de codi anteriors, obtindrem la sortida següent :
Amb aquest Dendrograma, ara determinarem el nombre òptim de clústers per al nostre model. Per a això, trobarem el distància vertical màxima que no talla cap barra horitzontal. Considereu el diagrama següent:
En el diagrama anterior, hem mostrat les distàncies verticals que no estan tallant les seves barres horitzontals. Com podem visualitzar, el 4thla distància es veu com a màxima, així que segons això, el nombre de clústers serà de 5 (les línies verticals d'aquest rang). També podem agafar el 2ndnombre ja que és aproximadament igual al 4thdistància, però tindrem en compte els 5 clústers perquè el mateix hem calculat a l'algorisme K-means.
Per tant, el nombre òptim de clústers serà 5 , i entrenarem el model en el següent pas, fent servir el mateix.
Pas 3: Entrenar el model de clustering jeràrquic
Com que sabem el nombre òptim necessari de clústers, ara podem entrenar el nostre model. El codi es mostra a continuació:
#training the hierarchical model on dataset from sklearn.cluster import AgglomerativeClustering hc= AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward') y_pred= hc.fit_predict(x)
En el codi anterior, hem importat el Clúster aglomeratiu classe del mòdul de clúster de la biblioteca scikit Learn.
Aleshores hem creat l'objecte d'aquesta classe anomenat com hc. La classe AgglomerativeClustering pren els paràmetres següents:
A l'última línia, hem creat la variable dependent y_pred per ajustar o entrenar el model. No només entrena el model, sinó que també retorna els clústers als quals pertany cada punt de dades.
la roda del ratolí no es desplaça correctament
Després d'executar les línies de codi anteriors, si passem per l'opció d'explorador de variables del nostre IDE Sypder, podem comprovar la variable y_pred. Podem comparar el conjunt de dades original amb la variable y_pred. Considereu la imatge següent:
Com podem veure a la imatge de dalt, el i_pred mostra el valor dels clústers, el que significa que l'identificador del client 1 pertany al 5thclúster (ja que la indexació comença des de 0, de manera que 4 significa 5thclúster), l'identificador de client 2 pertany a 4thclúster, etc.
Pas 4: visualització dels clústers
Com que hem entrenat el nostre model amb èxit, ara podem visualitzar els clústers corresponents al conjunt de dades.
Aquí farem servir les mateixes línies de codi que vam fer a l'agrupació k-means, excepte un canvi. Aquí no representarem el centroide que vam fer en k-means, perquè aquí hem utilitzat dendrograma per determinar el nombre òptim de clústers. El codi es mostra a continuació:
#visulaizing the clusters mtp.scatter(x[y_pred == 0, 0], x[y_pred == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') mtp.scatter(x[y_pred == 1, 0], x[y_pred == 1, 1], s = 100, c = 'green', label = 'Cluster 2') mtp.scatter(x[y_pred== 2, 0], x[y_pred == 2, 1], s = 100, c = 'red', label = 'Cluster 3') mtp.scatter(x[y_pred == 3, 0], x[y_pred == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') mtp.scatter(x[y_pred == 4, 0], x[y_pred == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show()
Sortida: en executar les línies de codi anteriors, obtindrem la següent sortida: