Resolución ejercicio Clusterización
Solución 1:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.cluster import KMeans df = pd.read_csv('Customers.csv') df=df.drop(["CustomerID","Gender","Profession"], axis=1) print(df.head()) print(df.columns) print(df.info()) print(df.describe()) inertia = [] for n in range(1, 15): algorithm = (KMeans(n_clusters=n, init='k-means++', n_init=10, max_iter=300, tol=0.0001, random_state=111, algorithm='elkan')) algorithm.fit(df) inertia.append(algorithm.inertia_) plt.figure(1, figsize=(15, 6)) plt.plot(np.arange(1, 15), inertia, 'o') plt.plot(np.arange(1, 15), inertia, '-', alpha=0.5) plt.xlabel('Number of Clusters'), plt.ylabel('Inertia') plt.show() tolerancias=[0.0001,0.0002,0.0003] algoritmos=['elkan','lloyd'] inits=['k-means++','random'] for tolerancia in tolerancias: for algoritmo in algoritmos: for init in inits: # Crear el modelo de mezcla Gaussiana em_model = KMeans(n_clusters=5, init=init, n_init=10, max_iter=300, tol=tolerancia, random_state=111, algorithm=algoritmo) # Ajustar el modelo a los datos em_model.fit(df) print(f"Inercia con {algoritmo},{init},{tolerancia} es {em_model.inertia_}")
Con EM:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.mixture import GaussianMixture df = pd.read_csv('Customers.csv') df=df.drop(["CustomerID","Gender","Profession"], axis=1) print(df.head()) print(df.columns) print(df.info()) print(df.describe()) covariance_types = ['full', 'tied', 'diag', 'spherical'] # Tipos de covarianza init_params_options = ['kmeans', 'random'] # Métodos de inicialización tol_values = [1e-3, 1e-2, 1e-1] # Valores de tolerancia max_iter_values = [100, 200, 300] # Iteraciones máximas results = [] # Bucle anidado para explorar combinaciones de parámetros for cov_type in covariance_types: for init_params in init_params_options: for tol in tol_values: for max_iter in max_iter_values: # Crear y ajustar el modelo de mezcla gaussiana gmm = GaussianMixture( n_components=5, covariance_type=cov_type, init_params=init_params, tol=tol, max_iter=max_iter, random_state=42 ) gmm.fit(df) # Calcular log-verosimilitud y BIC log_likelihood = gmm.score(df) bic = gmm.bic(df) # Almacenar resultados results.append({ 'covariance_type': cov_type, 'init_params': init_params, 'tol': tol, 'max_iter': max_iter, 'log_likelihood': log_likelihood, 'BIC': bic }) results_df = pd.DataFrame(results) print(results_df) # Encontrar el mejor modelo basado en el BIC (menor BIC es mejor) best_model = results_df.loc[results_df['BIC'].idxmin()] print("Mejor modelo encontrado:") print(f"Tipo de covarianza: {best_model['covariance_type']}") print(f"Método de inicialización: {best_model['init_params']}") print(f"Tolerancia: {best_model['tol']}") print(f"Iteraciones máximas: {best_model['max_iter']}") print(f"Log-verosimilitud: {best_model['log_likelihood']}") print(f"BIC: {best_model['BIC']}")
Incluyendo gráficos:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.decomposition import PCA from sklearn.cluster import KMeans df = pd.read_csv('Customers.csv') df=df.drop(["CustomerID","Gender","Profession"], axis=1) print(df.head()) print(df.columns) print(df.info()) print(df.describe()) inertia = [] for n in range(1, 15): algorithm = (KMeans(n_clusters=n, init='k-means++', n_init=10, max_iter=300, tol=0.0001, random_state=111, algorithm='elkan')) algorithm.fit(df) inertia.append(algorithm.inertia_) plt.figure(1, figsize=(15, 6)) plt.plot(np.arange(1, 15), inertia, 'o') plt.plot(np.arange(1, 15), inertia, '-', alpha=0.5) plt.xlabel('Number of Clusters'), plt.ylabel('Inertia') plt.show() # Crear el modelo de mezcla Gaussiana algorithm = KMeans(n_clusters=5, n_init=10, max_iter=300, random_state=111) # Ajustar el modelo a los datos algorithm.fit(df) print(f"Inercia es {algorithm.inertia_}") pca = PCA(n_components=2) reduced_data = pca.fit_transform(df) labels = algorithm.labels_ centroids1 = algorithm.cluster_centers_ df_reduced = pd.DataFrame(reduced_data, columns=['PCA1', 'PCA2']) df_reduced['Cluster'] = labels # Añadimos las etiquetas de los clusters # Crear una malla de puntos para las regiones x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1 y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 5), np.arange(y_min, y_max, 5)) # Predecir el cluster para cada punto de la malla Z = algorithm.predict(pca.inverse_transform(np.c_[xx.ravel(), yy.ravel()])) Z = Z.reshape(xx.shape) # Graficamos los clusters plt.figure(figsize=(10, 8)) plt.contourf(xx, yy, Z, cmap='viridis', alpha=0.2) # Contorno para las regiones sns.scatterplot(x='PCA1', y='PCA2', hue='Cluster', palette='viridis', data=df_reduced, style='Cluster', markers=True, s=100, alpha=0.8) plt.title("Clustering en 2D tras Reducción de Dimensionalidad") plt.xlabel("Componente Principal 1") plt.ylabel("Componente Principal 2") # Opcional: Añadir los centros de los clusters a la gráfica centroids = pca.transform(algorithm.cluster_centers_) plt.scatter(centroids[:, 0], centroids[:, 1], s=200, c='red', marker='X', label='Centroides') plt.legend() plt.grid(True) plt.show() import plotly as py import plotly.graph_objs as go pca = PCA(3) datos3 = pca.fit_transform(df) df2=pd.DataFrame(datos3,columns=[f"PC{i+1}" for i in range(datos3.shape[1])]) df2['cluster']=algorithm.predict(df) trace1 = go.Scatter3d( x=df2['PC1'], y=df2['PC2'], z=df2['PC3'], mode='markers', marker=dict( color=df2['cluster'], size=10, line=dict( color=df2['cluster'], width=12 ), opacity=0.8 ) ) data = [trace1] layout = go.Layout( title='Clusters wrt Age, Income and Spending Scores', scene=dict( xaxis=dict(title='PC1'), yaxis=dict(title='PC2'), zaxis=dict(title='PC3') ) ) fig = go.Figure(data=data, layout=layout) py.offline.plot(fig)