Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
1
resposta

[Projeto] Faça como eu fiz: aplicando técnicas de aprendizado não supervisionado | Fundamentos de IA: investigando algoritmos e abordagens de machine learning

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.

1 resposta
solução!

Oii, tudo bem?

Obrigada por compartilhar seu projeto aqui no fórum! Aplicar K-Means, PCA e clustering hierárquico juntos em uma mesma análise é um passo bem sólido, e você ainda foi além ao calcular o Adjusted Rand Index e o Silhouette Score para validar os resultados.

Um detalhe bem interessante do seu código: você projetou os centroides do K-Means no espaço PCA usando pca.transform(kmeans.cluster_centers_) para plotar junto com os dados reduzidos. Esse cuidado faz toda a diferença visual, porque garante que os centros apareçam no lugar certo no gráfico, e muita gente esquece disso.

O ARI de 0.620 com dados não rotulados é um resultado bastante expressivo. Mostra que a estrutura descoberta pelo K-Means tem boa correspondência com a biologia real das espécies.

Conte com a Alura para evoluir seus estudos. Em caso de dúvidas, fico à disposição.

Bons estudos!

Sucesso

Imagem da comunidade