Lda.pt

Lda.pt

Atualizado 2026-02-24 Leitura 2 min
Resumo
  • O LDA é uma redução de dimensionalidade supervisionada que maximiza a variância entre classes enquanto minimiza a variância dentro das classes.
  • Como os rótulos são utilizados, o LDA é frequentemente um forte passo de pré-processamento para tarefas de classificação.
  • O desempenho depende da distribuição das classes e das suposições de covariância.

Intuição #

Ao contrário do PCA, o LDA otimiza a separabilidade das classes, não apenas a dispersão geral. Ele busca direções de projeção onde as classes são compactas e bem separadas.

Explicação Detalhada #

1. PCA vs LDA #

  • PCA: não supervisionado, mantém as direções de maior variância independentemente dos rótulos de classe.
  • LDA: supervisionado, busca direções que maximizam a razão entre a variância entre classes e a variância dentro das classes.

2. Formulação Matemática #

Com classes rotuladas (C_1, \dots, C_k):

  1. Dispersão dentro das classes $$ S_W = \sum_{j=1}^k \sum_{x_i \in C_j} (x_i - \mu_j)(x_i - \mu_j)^\top $$
  2. Dispersão entre classes $$ S_B = \sum_{j=1}^k n_j (\mu_j - \mu)(\mu_j - \mu)^\top $$
  3. Otimização $$ J(w) = \frac{w^\top S_B w}{w^\top S_W w} $$ Os autovetores de (S_W^{-1} S_B) fornecem as direções discriminantes. No máximo (k-1) componentes carregam informação.

3. Construir um conjunto de dados #

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_blobs

X, y = make_blobs(
    n_samples=600,
    n_features=3,
    random_state=11711,
    cluster_std=4,
    centers=3,
)

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(projection="3d")
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y)
ax.set_xlabel("$x_1$")
ax.set_ylabel("$x_2$")
ax.set_zlabel("$x_3$")

Blobs 3D


4. Aplicar LDA #

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

lda = LDA(n_components=2).fit(X, y)
X_lda = lda.transform(X)

plt.figure(figsize=(8, 8))
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, alpha=0.5)
plt.xlabel("LD1")
plt.ylabel("LD2")
plt.title("2-D embedding via LDA")
plt.show()

Projeção LDA


5. Comparação com PCA #

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

plt.figure(figsize=(8, 8))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, alpha=0.5)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("2-D embedding via PCA")
plt.show()

Comparação PCA

O PCA mistura as classes porque ignora os rótulos; o LDA mantém-nas separadas.


6. Notas práticas #

  • O número de discriminantes úteis é no máximo n_classes - 1.
  • Padronize as características antes do ajuste, especialmente quando unidades diferentes estão misturadas.
  • O LDA assume covariância aproximadamente igual dentro das classes; quando isso é violado, considere QDA ou LDA regularizado.