Linear Discriminant Analysis (LDA) busca proyecciones que maximizan la separabilidad entre clases. A diferencia de la PCA, utiliza las etiquetas para mantener juntas las muestras de una misma clase y alejar las demás.
1. PCA vs LDA #
- PCA: no usa etiquetas; sólo captura la mayor varianza global.
- LDA: supervisada; maximiza el cociente entre varianza inter-clase e intra-clase.
2. Formulación #
Para clases (C_1, \dots, C_k):
- Disp. intra-clase: (S_W = \sum_{j=1}^k \sum_{x_i \in C_j} (x_i - \mu_j)(x_i - \mu_j)^\top)
- Disp. inter-clase: (S_B = \sum_{j=1}^k n_j (\mu_j - \mu)(\mu_j - \mu)^\top)
- Optimización: (J(w) = \frac{w^\top S_B w}{w^\top S_W w}); los autovectores de (S_W^{-1} S_B) definen las direcciones discriminantes.
3. Dataset #
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$")
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("Embedding 2D con LDA")
plt.show()
5. Comparar con 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("Embedding 2D con PCA")
plt.show()
6. Consejos #
- El número máximo de componentes útiles es
n_clases - 1. - Estandariza las variables antes de entrenar.
- LDA asume covarianzas similares entre clases; si no se cumple, evalúa QDA o versiones regularizadas.
Resumen #
- LDA maximiza (S_B) y minimiza (S_W) para obtener proyecciones separables.
- Complementa a PCA: PCA conserva varianza, LDA conserva estructura de clases.
- Útil tanto para visualización como para features en clasificadores lineales.