Clustering Jerárquico con Datos Sintéticos
Clustering Jerárquico con Datos Sintéticos
Este proyecto aplica técnicas de clustering jerárquico sobre datos generados artificialmente, utilizando librerías como scikit-learn y scipy. Incluye visualización con dendogramas, análisis de silueta y comparación de resultados mediante agrupación aglomerativa.
1# Importamos las librerías necesarias para clustering jerárquico
2import numpy as np
3import pandas as pd
4import matplotlib.pyplot as plt
5import seaborn as sns
6from sklearn.datasets import make_blobs
7from sklearn.cluster import AgglomerativeClustering
8from sklearn.metrics import silhouette_score
9from scipy.cluster.hierarchy import dendrogram, linkage
10
11# Preparamos los datos de prueba con 4 centros, 2 características y desviación estándar de 0.8
12x, y, c = make_blobs(n_samples=500, cluster_std=0.8, centers=4, n_features=2, return_centers=True)
1# Creamos los DataFrames para los puntos y los centroides
2df = pd.DataFrame({
3 'x1': x[:, 0],
4 'x2': x[:, 1],
5 'y': y
6})
7
8centroides = pd.DataFrame({
9 'x1': c[:, 0],
10 'x2': c[:, 1]
11})
12
13# Visualizamos los datos en un diagrama de dispersión
14sns.scatterplot(data=df, x='x1', y='x2')
15plt.show()
1# Dendograma usando linkage
2
3# Creamos el dendograma a partir de los datos generados
4# El método 'ward' minimiza la varianza dentro de cada clúster
5
6dendo_plot = dendrogram(linkage(x, method='ward'))
7
8# Añadimos etiquetas y mostramos la gráfica
9plt.title('Dendograma usando linkage')
10plt.xlabel('Clusters')
11plt.ylabel('Distancia euclidiana')
12plt.show()
Escogemos donde podamos trazar una linea y separar o tomar un numero de lineas vertiales de manera sencilla,los mas adeacudo es en el numero 4, ya que podemos tomar o trazar una linea en las 4 lineas separadas con una distancia uniforme
1# Aplicamos el Hierarchical Clustering
2hierachical_Clu = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
3
4# Hacemos la predicción del agrupamiento
5y_hc = hierachical_Clu.fit_predict(x)
6
7# Asignamos los clusters al DataFrame original
8df['clusters'] = y_hc
9
10# Visualizamos la asignación de los clusters con un scatterplot
11sns.scatterplot(data=df, x='x1', y='x2', hue='clusters', palette='coolwarm')
12plt.show()
1# Evaluamos nuestro modelo utilizando el silhouette_score
2print(silhouette_score(x, y_hc).round(5) * 100, '%') # Ejemplo de salida: 80.463 %
80.463 % de Presición dado el score
1# Graficamos el gráfico de silueta
2from sklearn.datasets import make_blobs
3from sklearn.cluster import KMeans
4from sklearn.metrics import silhouette_samples, silhouette_score
5
6import matplotlib.pyplot as plt
7import matplotlib.cm as cm
8import numpy as np
9
10range_n_clusters = [4]
11
12for n_clusters in range_n_clusters:
13 fig, (ax1, ax2) = plt.subplots(1, 2)
14 fig.set_size_inches(18, 7)
15
16 ax1.set_xlim([-0.1, 1])
17 ax1.set_ylim([0, len(x) + (n_clusters + 1) * 10])
18
19 clusterer = AgglomerativeClustering(n_clusters=n_clusters, affinity='euclidean', linkage='ward')
20 cluster_labels = clusterer.fit_predict(x)
21
22 silhouette_avg = silhouette_score(x, cluster_labels)
23 print("For n_clusters =", n_clusters, "The average silhouette_score is :", silhouette_avg)
24
25 sample_silhouette_values = silhouette_samples(x, cluster_labels)
26
27 y_lower = 10
28 for i in range(n_clusters):
29 ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
30 ith_cluster_silhouette_values.sort()
31
32 size_cluster_i = ith_cluster_silhouette_values.shape[0]
33 y_upper = y_lower + size_cluster_i
34
35 color = cm.nipy_spectral(float(i) / n_clusters)
36 ax1.fill_betweenx(
37 np.arange(y_lower, y_upper),
38 0,
39 ith_cluster_silhouette_values,
40 facecolor=color,
41 edgecolor=color,
42 alpha=0.7,
43 )
44
45 ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
46
47 y_lower = y_upper + 10
48
49 ax1.set_title("The silhouette plot for the various clusters.")
50 ax1.set_xlabel("The silhouette coefficient values")
51 ax1.set_ylabel("Cluster label")
52
53 ax1.axvline(x=silhouette_avg, color="red", linestyle="--")
54
55 ax1.set_yticks([])
56 ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
57
58 colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
59 ax2.scatter(
60 x[:, 0], x[:, 1], marker=".", s=30, lw=0, alpha=0.7, c=colors, edgecolor="k"
61 )
62
63plt.show()
Explora el Proyecto
Contenido Relacionado
¿Qué es la visión artificial?
Computer Vision es un campo de la informática que se centra en permitir que los equipos identifiquen y comprendan objetos y personas en imágenes y vídeos.
REGRESIÓN LOGÍSTICA. CURSO COMPLETO
Curso completo de regresión logística binaria y multinomial en SPSS. Todos los análisis y la forma de realizarlo, interpretarlo y reportarlo en tu informe de investigación.
Comentarios
Cargando comentarios...