import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from scipy.cluster.hierarchy import dendrogram, linkage
Carregar dataset Iris
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
Padronizar os dados
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
1. K-MEANS CLUSTERING
print("=== K-MEANS ===")
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
kmeans_labels = kmeans.fit_predict(X_scaled)
print(f"Inércia: {kmeans.inertia_:.2f}")
print(f"Centros (primeiras 2 dimensões): {kmeans.cluster_centers_[:, :2]}\n")
2. PCA - Redução de Dimensionalidade
print("=== PCA ===")
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f"Variância explicada: {pca.explained_variance_ratio_}")
print(f"Variância total: {pca.explained_variance_ratio_.sum():.2%}\n")
3. Visualizações
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
Plot 1: K-Means com PCA
ax = axes[0, 0]
scatter = ax.scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans_labels,
cmap='viridis', s=100, alpha=0.6, edgecolors='black')
ax.scatter(pca.transform(kmeans.cluster_centers_)[:, 0],
pca.transform(kmeans.cluster_centers_)[:, 1],
c='red', marker='X', s=300, edgecolors='black', linewidths=2)
ax.set_xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%})")
ax.set_ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%})")
ax.set_title("K-Means (K=3) com PCA")
ax.grid(alpha=0.3)
Plot 2: Dados reais com PCA
ax = axes[0, 1]
ax.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis',
s=100, alpha=0.6, edgecolors='black')
ax.set_xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%})")
ax.set_ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%})")
ax.set_title("Dados Reais no Espaço PCA")
ax.grid(alpha=0.3)
Plot 3: Dendrogram
ax = axes[1, 0]
linkage_matrix = linkage(X_scaled, method='ward')
dendrogram(linkage_matrix, ax=ax, no_labels=True)
ax.set_title("Hierarchical Clustering (Ward)")
ax.set_ylabel("Distância")
Plot 4: Curva do cotovelo
ax = axes[1, 1]
inertias = []
K_range = range(1, 11)
for k in K_range:
km = KMeans(n_clusters=k, random_state=42, n_init=10)
km.fit(X_scaled)
inertias.append(km.inertia_)
ax.plot(K_range, inertias, 'bo-', linewidth=2, markersize=8)
ax.axvline(x=3, color='red', linestyle='--', label='K=3')
ax.set_xlabel("Número de Clusters (K)")
ax.set_ylabel("Inércia")
ax.set_title("Curva do Cotovelo")
ax.legend()
ax.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('/mnt/user-data/outputs/clustering_visualization.png', dpi=300, bbox_inches='tight')
print("Visualizações salvas em clustering_visualization.png")
plt.show()
4. Análise de Componentes Principais
print("=== COMPONENTES PRINCIPAIS ===")
print("Carregamentos (loadings) das features:")
loadings = pca.components_.T * np.sqrt(pca.explained_variance_)
feature_names = iris.feature_names
for i, component in enumerate(['PC1', 'PC2']):
print(f"\n{component}:")
for feat, load in zip(feature_names, loadings[:, i]):
print(f" {feat}: {load:.3f}")
5. Matriz de confusão K-Means vs Reais
print("\n=== COMPARAÇÃO K-MEANS vs CLASSES REAIS ===")
from sklearn.metrics import adjusted_rand_score, silhouette_score
ari = adjusted_rand_score(y, kmeans_labels)
silhouette = silhouette_score(X_scaled, kmeans_labels)
print(f"Adjusted Rand Index: {ari:.3f}")
print(f"Silhouette Score: {silhouette:.3f}")
::
Este trabalho aplicou técnicas de aprendizado não supervisionado ao dataset Iris, explorando clustering e redução de dimensionalidade. O K-Means identificou naturalmente três clusters com Silhuette Score de 0.460, indicando boa separação entre grupos. A análise revelou correlação moderada (Adjusted Rand Index: 0.620) com as classes biológicas reais, demonstrando que os algoritmos descobrem padrões significativos sem supervisão.