Link al resultado: https://colab.research.google.com/drive/1lCfTH0bO7xBHGTE3nH7nYadcFtRU6R89#scrollTo=WMqzAu2syHwC&fullscreenOutput=true
(Debería cargar, lo intenté desde una ventana incógnito y aparece)
Código creado, basado en la solución del profesor:
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import scipy.cluster.hierarchy as sch
import matplotlib.pyplot as plt
# Cargar datos
iris = load_iris()
X = iris.data
y = iris.target
# Normalizar
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# --- K-Means con 3 clusters ---
kmeans = KMeans(n_clusters=3, random_state=42)
clusters_kmeans = kmeans.fit_predict(X_scaled)
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], c=clusters_kmeans, cmap='viridis')
plt.title("K-Means: 3 clusters")
plt.xlabel("Largo del sépalo")
plt.ylabel("Ancho del sépalo")
plt.show()
# --- K-Means con 4 clusters (variación) ---
kmeans4 = KMeans(n_clusters=4, random_state=42)
clusters_kmeans4 = kmeans4.fit_predict(X_scaled)
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], c=clusters_kmeans4, cmap='viridis')
plt.title("K-Means: 4 clusters (variación)")
plt.xlabel("Largo del sépalo")
plt.ylabel("Ancho del sépalo")
plt.show()
# --- Dendrograma ---
plt.figure(figsize=(10, 5))
sch.dendrogram(sch.linkage(X_scaled, method='ward'))
plt.title("Dendrograma del Agrupamiento Jerárquico")
plt.xlabel("Muestras")
plt.ylabel("Distancia Euclidiana")
plt.show()
# --- Agrupamiento Jerárquico con 3 clusters ---
hc = AgglomerativeClustering(n_clusters=3, metric='euclidean', linkage='ward')
clusters_hc = hc.fit_predict(X_scaled)
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], c=clusters_hc, cmap='viridis')
plt.title("Agrupamiento Jerárquico: 3 clusters")
plt.xlabel("Largo del sépalo")
plt.ylabel("Ancho del sépalo")
plt.show()
# --- PCA con 2 componentes ---
pca2 = PCA(n_components=2)
X_pca2 = pca2.fit_transform(X_scaled)
plt.figure(figsize=(8, 6))
plt.scatter(X_pca2[:, 0], X_pca2[:, 1], c=y, cmap='viridis', alpha=0.7)
plt.title(f"PCA: 2 componentes ({pca2.explained_variance_ratio_.sum()*100:.1f}% de la varianza)")
plt.xlabel("Componente Principal 1")
plt.ylabel("Componente Principal 2")
plt.colorbar(label="Especie")
plt.show()
# --- PCA con 3 componentes (variación) ---
pca3 = PCA(n_components=3)
X_pca3 = pca3.fit_transform(X_scaled)
print(f"Varianza explicada con 3 componentes: {pca3.explained_variance_ratio_.sum()*100:.1f}%")
print(f"Varianza explicada con 2 componentes: {pca2.explained_variance_ratio_.sum()*100:.1f}%")
Agregué una variación con 3 componentes para ver qué tanto mejora en retrospectiva a 2, y la eficacia cambió del 95.8% mostrado en clase a un 99.5% de varianza explicada.