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)