Machine Learning from Scratch: Implementando K-Means Clustering em Python

Teoria do K-Means clustering

Etapas do Algoritmo:

  1. Inicialização: Escolher K centros (centroides) iniciais aleatoriamente.
  2. Atribuição: Para cada ponto de dado, atribuir o cluster mais próximo com base na distância euclidiana.
  3. Atualização: Recalcular a posição dos centroides como a média dos pontos atribuídos a eles.
  4. Convergência: Repetir os passos 2 e 3 até que os centroides não mudem mais ou até que um número máximo de iterações seja atingido.

Conceitos matemáticos por trás do K-Means

Desafios e limitações do K-Means

Implementação do K-Means do zero

import numpy as np
import matplotlib.pyplot as plt
def initialize_centroids(X, k):
    """Seleciona K pontos aleatórios do dataset como centroides iniciais."""
    n_samples = X.shape[0]
    random_indices = np.random.choice(n_samples, k, replace=False)
    centroids = X[random_indices]
    return centroids
    def assign_clusters(X, centroids):
        """Atribui cada ponto ao cluster mais próximo."""
        distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
        cluster_labels = np.argmin(distances, axis=1)
        return cluster_labels
    
    def update_centroids(X, cluster_labels, k):
        """Recalcula os centroides como a média dos pontos em cada cluster."""
        new_centroids = np.array([X[cluster_labels == i].mean(axis=0) for i in range(k)])
        return new_centroids
    
    def kmeans(X, k, max_iters=100, tol=1e-4):
        """Executa o algoritmo K-Means."""
        centroids = initialize_centroids(X, k)
        for i in range(max_iters):
            cluster_labels = assign_clusters(X, centroids)
            new_centroids = update_centroids(X, cluster_labels, k)
            
            # Verifica convergência
            if np.all(np.abs(new_centroids - centroids) < tol):
                break
            centroids = new_centroids
        
        return centroids, cluster_labels
    

    Aplicando em um dataset real

    from sklearn.datasets import load_iris
    
    # Carrega o dataset Iris
    iris = load_iris()
    X = iris.data[:, :2]  # Apenas duas features para visualização
    
    # Visualização inicial
    plt.scatter(X[:, 0], X[:, 1], s=50, c='gray')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title('Dados Brutos')
    plt.show()
    
    k = 3  # Número de clusters
    centroids, cluster_labels = kmeans(X, k)
    
    # Visualização dos Clusters
    for i in range(k):
        plt.scatter(X[cluster_labels == i, 0], X[cluster_labels == i, 1], label=f'Cluster {i + 1}')
    plt.scatter(centroids[:, 0], centroids[:, 1], s=200, c='red', marker='X', label='Centroides')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title('Clusters Formados')
    plt.legend()
    plt.show()
    

    Comparando com scikit-learn

    from sklearn.cluster import KMeans
    
    kmeans_sklearn = KMeans(n_clusters=k, random_state=42)
    kmeans_sklearn.fit(X)
    
    # Visualização dos Clusters com scikit-learn
    plt.scatter(X[:, 0], X[:, 1], c=kmeans_sklearn.labels_, cmap='viridis', s=50)
    plt.scatter(kmeans_sklearn.cluster_centers_[:, 0], kmeans_sklearn.cluster_centers_[:, 1],
                s=200, c='red', marker='X', label='Centroides')
    plt.xlabel('Feature 1')
    plt.ylabel('Feature 2')
    plt.title('Clusters com scikit-learn')
    plt.legend()
    plt.show()
    

    Conclusão

    1. Mãos à obra aprendizado de máquina com Scikit-Learn, Keras & TensorFlow: conceitos, ferramentas e técnicas para a construção de sistemas inteligentes.
    2. Python para análise de dados
    3. An Introduction to Statistical Learning (Python e R)

    Deixe um comentário

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

    Rolar para cima
    ×