59  Regresión lineal y clasificadores lineales: Fisher y el perceptrón

Autor/a

Diego Villalba

Los árboles y los vecinos cercanos construyen fronteras flexibles a partir de reglas locales. Los modelos lineales hacen la apuesta contraria: resumen toda la información en un puntaje que es una suma ponderada de las variables,

\[ g(\mathbf{x}) = w_0 + w_1 x_1 + \cdots + w_p x_p = \mathbf{w}^\top\mathbf{x} + w_0, \]

y deciden con ese puntaje. Para predecir un número, el puntaje es la predicción; para clasificar, basta mirar su signo. Su frontera de decisión es una recta en el plano y un hiperplano en general. Son menos flexibles que un árbol profundo, pero tienen poca varianza, se entrenan rápido, sus coeficientes se interpretan y son la base de la regresión logística, las máquinas de soporte vectorial y las redes neuronales.

Este capítulo recorre tres maneras de elegir \(\mathbf{w}\): mínimos cuadrados, que ajusta números; el discriminante de Fisher, que busca la dirección que mejor separa dos clases; y el perceptrón, que corrige sus errores uno a uno. El capítulo siguiente presenta la cuarta y más usada, la regresión logística.

59.1 Regresión lineal

59.1.1 Intuición: la recta que menos se equivoca

Cinco estudiantes registraron sus horas de estudio \(x\) y su calificación \(y\) (sobre 10):

Estudiante 1 2 3 4 5
Horas \(x\) 1 2 3 4 5
Calificación \(y\) 2 3 5 4 6
Tabla 59.1: Horas de estudio y calificación de cinco estudiantes.

Ninguna recta pasa por los cinco puntos. Para cada recta candidata \(\hat{y} = \beta_0 + \beta_1 x\), cada estudiante tiene un residuo \(e_i = y_i - \hat{y}_i\). El criterio de mínimos cuadrados (Legendre 1805; Gauss 1809) elige la recta que minimiza la suma de los residuos al cuadrado, \(\text{SSE} = \sum_i e_i^2\). Elevar al cuadrado impide que errores positivos y negativos se cancelen y castiga más los errores grandes.

59.1.2 Construcción paso a paso

Paso 1. Centrar. Las medias son \(\bar{x} = 3\) y \(\bar{y} = 20/5 = 4\).

Paso 2. Pendiente. Para una variable, la solución de mínimos cuadrados es el cociente entre la covariación de \(x\) con \(y\) y la variación de \(x\):

\(x_i - \bar{x}\) −2 −1 0 1 2 Suma
\(y_i - \bar{y}\) −2 −1 1 0 2
\((x_i - \bar{x})(y_i - \bar{y})\) 4 1 0 0 4 \(S_{xy} = 9\)
\((x_i - \bar{x})^2\) 4 1 0 1 4 \(S_{xx} = 10\)
Tabla 59.2: Cálculo de la pendiente.

\[ \hat{\beta}_1 = \frac{S_{xy}}{S_{xx}} = \frac{9}{10} = 0.9, \qquad \hat{\beta}_0 = \bar{y} - \hat{\beta}_1\bar{x} = 4 - 0.9 \cdot 3 = 1.3. \]

Cada hora adicional de estudio se asocia con 0.9 puntos más de calificación.

Paso 3. Predicciones y residuos. Con \(\hat{y} = 1.3 + 0.9x\):

\(x\) 1 2 3 4 5
\(\hat{y}\) 2.2 3.1 4.0 4.9 5.8
\(e = y - \hat{y}\) −0.2 −0.1 1.0 −0.9 0.2
\(e^2\) 0.04 0.01 1.00 0.81 0.04
Tabla 59.3: Predicciones y residuos de la recta de mínimos cuadrados.

Paso 4. Métricas. \(\text{SSE} = 1.90\), de modo que el error cuadrático medio es \(\text{MSE} = 1.90/5 = 0.38\) y su raíz \(\text{RMSE} = 0.616\) puntos. El error absoluto medio es \(\text{MAE} = (0.2 + 0.1 + 1.0 + 0.9 + 0.2)/5 = 0.48\). La variación total respecto a la media es \(\text{SST} = \sum_i (y_i - \bar{y})^2 = 4 + 1 + 1 + 0 + 4 = 10\), así que

\[ R^2 = 1 - \frac{\text{SSE}}{\text{SST}} = 1 - \frac{1.9}{10} = 0.81: \]

la recta explica el 81 % de la variación de las calificaciones respecto a predecir siempre el promedio.

59.1.3 Formalización

Con \(p\) variables, el modelo es \(y_i = \beta_0 + \sum_j \beta_j x_{ij} + \varepsilon_i\). Apilando las observaciones en la matriz de diseño \(\mathbf{X} \in \mathbb{R}^{n \times (p+1)}\), cuya primera columna es de unos, y en el vector \(\mathbf{y}\), el problema es

\[ \hat{\boldsymbol{\beta}} = \arg\min_{\boldsymbol{\beta}} \|\mathbf{y} - \mathbf{X}\boldsymbol{\beta}\|^2. \tag{59.1}\]

Derivando e igualando a cero se obtienen las ecuaciones normales \(\mathbf{X}^\top\mathbf{X}\hat{\boldsymbol{\beta}} = \mathbf{X}^\top\mathbf{y}\) y, si \(\mathbf{X}^\top\mathbf{X}\) es invertible,

\[ \hat{\boldsymbol{\beta}} = (\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top\mathbf{y}. \tag{59.2}\]

Geométricamente, \(\hat{\mathbf{y}} = \mathbf{X}\hat{\boldsymbol{\beta}}\) es la proyección ortogonal de \(\mathbf{y}\) sobre el espacio generado por las columnas de \(\mathbf{X}\), y por eso los residuos son perpendiculares a cada columna: suman cero y no están correlacionados con ninguna variable. Si dos variables son (casi) linealmente dependientes, \(\mathbf{X}^\top\mathbf{X}\) es (casi) singular y los coeficientes se vuelven inestables (multicolinealidad); la solución práctica es eliminar variables redundantes o regularizar sumando \(\lambda\|\boldsymbol{\beta}\|^2\) a la pérdida (ridge) (Hoerl y Kennard 1970), tema que se retoma con la regresión logística.

Métrica Fórmula Unidades Sensible a atípicos
MSE \(\frac{1}{n}\sum e_i^2\) cuadrado de \(y\) mucho
RMSE \(\sqrt{\text{MSE}}\) las de \(y\) mucho
MAE \(\frac{1}{n}\sum \lvert e_i \rvert\) las de \(y\) poco
\(R^2\) \(1 - \text{SSE}/\text{SST}\) sin unidades mucho
Tabla 59.4: Métricas de regresión.

59.1.4 Laboratorio: ajusta la recta

Mueve la pendiente y el intercepto para minimizar la suma de cuadrados; cada residuo se dibuja como un cuadrado cuya área es su contribución a la SSE. El panel derecho muestra la SSE de todas las rectas posibles: el mínimo es la solución de mínimos cuadrados. Arrastra un punto para ver cuánto puede mover la recta un solo dato atípico.

Laboratorio · Mínimos cuadrados

¿Puedes encontrar la recta de mínima suma de cuadrados?

Ajusta β₀ y β₁ con los controles, o pulsa el botón para ver la solución. Arrastra los puntos para cambiar los datos.

Acciones
SSE de tu recta
SSE mínima posible
R² de tu recta
Recta óptima

Datos, recta y cuadrados de los residuos

datostu rectamínimos cuadradosresiduo²

SSE para cada (β₀, β₁)

tu rectamínimomás oscuro = menor SSE

Guía del laboratorio.

  1. Sin pulsar el botón, intenta llegar a una SSE menor que 2. Después compara con la solución y con la Tabla 59.3.
  2. Observa el mapa: ¿por qué el valle es una franja diagonal y no un círculo?
  3. Predice antes de mover: si arrastras al quinto estudiante hasta una calificación de 9, ¿la pendiente subirá mucho o poco? Pulsa Mínimos cuadrados y compruébalo.
  4. ¿Qué residuo aporta más a la SSE en la solución original? ¿Por qué un error de 1 punto pesa 25 veces más que uno de 0.2?

59.2 De la regresión a la clasificación lineal

59.2.1 La geometría de un clasificador lineal

Con dos clases codificadas como \(y \in \{-1, +1\}\), un clasificador lineal decide

\[ \hat{y} = \operatorname{signo}\big(g(\mathbf{x})\big), \qquad g(\mathbf{x}) = \mathbf{w}^\top\mathbf{x} + w_0. \tag{59.3}\]

La frontera \(g(\mathbf{x}) = 0\) es un hiperplano. Tres hechos geométricos se usarán en este capítulo y en el de máquinas de soporte vectorial:

  • \(\mathbf{w}\) es perpendicular a la frontera: apunta hacia la región positiva.
  • \(w_0\) desplaza la frontera sin girarla.
  • La distancia con signo de un punto a la frontera es \(g(\mathbf{x})/\|\mathbf{w}\|\). El puntaje no solo dice de qué lado está el punto, sino qué tan lejos.

Una primera idea para elegir \(\mathbf{w}\) es usar mínimos cuadrados con \(y \in \{-1, +1\}\) como respuesta. Funciona sorprendentemente bien cuando las clases son nubes compactas, pero tiene un defecto: castiga también a los puntos bien clasificados y lejos de la frontera, porque su puntaje se aleja de \(\pm 1\). Un grupo de puntos correctos pero extremos puede arrastrar la frontera y provocar errores. Las dos secciones siguientes, y la regresión logística, son maneras de evitar ese problema.

59.3 El discriminante lineal de Fisher

59.3.1 Intuición: la mejor sombra

Proyectemos todos los puntos sobre una recta que pasa por el origen con dirección \(\mathbf{w}\): cada punto se convierte en un número, su «sombra» \(z = \mathbf{w}^\top\mathbf{x}\). Una buena dirección es aquella en que las sombras de las dos clases quedan lejos entre sí y apretadas dentro de cada clase. Fisher (1936) propuso medirlo con el cociente

\[ J(\mathbf{w}) = \frac{(\bar{z}_A - \bar{z}_B)^2}{s_A^2 + s_B^2}, \tag{59.4}\]

donde \(\bar{z}\) y \(s^2 = \sum (z - \bar{z})^2\) son la media y la dispersión de las sombras de cada clase. La dirección que une las medias parece la elección obvia, pero no considera la forma de las nubes: si una clase está estirada en diagonal, sus sombras sobre esa dirección se dispersan.

59.3.2 Construcción paso a paso

Dos clases de tres puntos: \(A = \{(1, 2), (2, 3), (3, 3)\}\) y \(B = \{(4, 5), (5, 6), (6, 5)\}\).

Paso 1. Medias. \(\mathbf{m}_A = (2, 2.67)\) y \(\mathbf{m}_B = (5, 5.33)\).

Paso 2. Dispersión dentro de cada clase. Con las desviaciones respecto a la media de cada clase, \(\mathbf{S}_A = \sum (\mathbf{x} - \mathbf{m}_A)(\mathbf{x} - \mathbf{m}_A)^\top\):

\[ \mathbf{S}_A = \begin{pmatrix} 2 & 1 \\ 1 & 0.67 \end{pmatrix}, \qquad \mathbf{S}_B = \begin{pmatrix} 2 & 0 \\ 0 & 0.67 \end{pmatrix}, \qquad \mathbf{S}_W = \mathbf{S}_A + \mathbf{S}_B = \begin{pmatrix} 4 & 1 \\ 1 & 1.33 \end{pmatrix}. \]

La clase \(A\) tiene covarianza positiva (sube en diagonal); la \(B\), no.

Paso 3. Dirección de Fisher. La dirección que maximiza \(J\) es

\[ \mathbf{w}^{*} \propto \mathbf{S}_W^{-1}(\mathbf{m}_A - \mathbf{m}_B) = \frac{1}{4.33}\begin{pmatrix} 1.33 & -1 \\ -1 & 4 \end{pmatrix}\begin{pmatrix} -3 \\ -2.67 \end{pmatrix} = \begin{pmatrix} -0.31 \\ -1.77 \end{pmatrix}. \]

Normalizada, \(\mathbf{w}^{*} \approx (-0.17, -0.99)\): casi vertical, muy distinta de la diferencia de medias \((-3, -2.67)\), que apunta en diagonal.

Paso 4. Comparar. Proyectando sobre cada dirección (normalizada):

Dirección Sombras de A Sombras de B \(J\)
Diferencia de medias −2.08, −3.49, −4.24 −6.31, −7.72, −7.81 4.22
Fisher −2.14, −3.30, −3.47 −5.61, −6.77, −5.95 5.64
Tabla 59.5: Proyecciones sobre la diferencia de medias y sobre la dirección de Fisher.

Con la dirección de Fisher, las sombras de \(A\) quedan más juntas (la diagonal de \(A\) casi desaparece al proyectar) y el cociente sube un 34 %. La clasificación se completa con un umbral sobre \(z\); el más simple es el punto medio de las medias proyectadas, \((-2.97 - 6.11)/2 = -4.54\).

59.3.3 Formalización

Con las matrices de dispersión entre clases \(\mathbf{S}_B = (\mathbf{m}_A - \mathbf{m}_B)(\mathbf{m}_A - \mathbf{m}_B)^\top\) y dentro de las clases \(\mathbf{S}_W\), el criterio es un cociente de Rayleigh generalizado:

\[ J(\mathbf{w}) = \frac{\mathbf{w}^\top\mathbf{S}_B\mathbf{w}}{\mathbf{w}^\top\mathbf{S}_W\mathbf{w}}, \qquad \mathbf{w}^{*} = \arg\max_{\mathbf{w}} J(\mathbf{w}) \propto \mathbf{S}_W^{-1}(\mathbf{m}_A - \mathbf{m}_B). \tag{59.5}\]

Es la misma estructura que el PCA del capítulo de preprocesamiento, con una diferencia crucial: PCA busca la dirección de máxima varianza sin mirar las clases; Fisher, la de máxima separación entre clases. Con \(K\) clases, Fisher encuentra hasta \(K - 1\) direcciones, lo que lo convierte también en una técnica de reducción de dimensión supervisada. Cuando las clases son normales con la misma covarianza, la dirección de Fisher coincide con la del clasificador bayesiano óptimo, el análisis discriminante lineal (LDA) que se estudia en el capítulo de clasificadores bayesianos.

59.3.4 Laboratorio: la dirección de Fisher

Laboratorio · Discriminante de Fisher

¿Desde qué ángulo se separan mejor las clases?

Gira la dirección de proyección y observa las «sombras» de cada clase y el cociente J. Los botones llevan a la dirección de Fisher o a la diferencia de medias.

Datos
Ir a
J de esta dirección
J de Fisher (máximo)
J de la diferencia de medias
Errores con umbral en el punto medio

Datos y dirección de proyección

clase Aclase Bdirección w

Sombras sobre la dirección

J según el ángulo

J(ángulo)actualFisherdiferencia de medias

Guía del laboratorio.

  1. Con Seis puntos, pulsa Diferencia de medias y luego Dirección de Fisher. Comprueba los valores de \(J\) de la Tabla 59.5.
  2. ¿Por qué con la dirección de Fisher las sombras de la clase A quedan más juntas?
  3. Cambia a Dos nubes alargadas. Predice antes de pulsar: ¿la diferencia de medias separará bien las clases? Compara los errores con el umbral en el punto medio.
  4. Busca un ángulo con \(J\) casi cero. ¿Qué tienen de especial las sombras en esa dirección?

59.4 El perceptrón

59.4.1 Intuición: aprender de los errores, uno a la vez

El perceptrón de Rosenblatt (1958), inspirado en una neurona, no resuelve ninguna ecuación: recorre los ejemplos y, cada vez que clasifica uno mal, gira la frontera hacia él. Si un punto positivo cae del lado negativo, se suma su vector a \(\mathbf{w}\); si un negativo cae del lado positivo, se resta. Es el antecedente directo de las redes neuronales y del descenso de gradiente estocástico.

59.4.2 Construcción paso a paso

Usamos el vector aumentado \(\tilde{\mathbf{x}} = (1, x_1, x_2)\) y \(\tilde{\mathbf{w}} = (w_0, w_1, w_2)\), de modo que \(g = \tilde{\mathbf{w}}^\top\tilde{\mathbf{x}}\). Cuatro puntos, recorridos en orden:

Punto \(\mathbf{x}\) \(y\)
P1 (2, 1) +1
P2 (3, 4) −1
P3 (1, 3) −1
P4 (4, 2) +1
Tabla 59.6: Cuatro puntos linealmente separables.

Empezamos con \(\tilde{\mathbf{w}} = (0, 0, 0)\). Un punto está mal clasificado si \(y\,g \le 0\) (con \(\mathbf{w} = 0\) todos lo están). La regla, con tasa de aprendizaje 1, es \(\tilde{\mathbf{w}} \leftarrow \tilde{\mathbf{w}} + y\,\tilde{\mathbf{x}}\):

Época Punto \(g\) antes ¿Error? \(\tilde{\mathbf{w}}\) después
1 P1 0 sí (0,0,0) + (1,2,1) = (1, 2, 1)
1 P2 1 + 6 + 4 = 11 sí (\(y = -1\)) (1,2,1) − (1,3,4) = (0, −1, −3)
1 P3 0 − 1 − 9 = −10 no (0, −1, −3)
1 P4 0 − 4 − 6 = −10 sí (0,−1,−3) + (1,4,2) = (1, 3, −1)
2 P1 1 + 6 − 1 = 6 no (1, 3, −1)
2 P2 1 + 9 − 4 = 6 sí (0, 0, −5)
2 P4 0 + 0 − 10 = −10 sí (1, 4, −3)
3 P2 1 + 12 − 12 = 1 sí (0, 1, −7)
3 P4 0 + 4 − 14 = −10 sí (1, 5, −5)
4 — ninguno (1, 5, −5)
Tabla 59.7: Traza del perceptrón (en las épocas 2 y 3 se omiten los puntos sin error).

Tras siete actualizaciones, la época 4 no comete errores: la frontera es \(1 + 5x_1 - 5x_2 = 0\), es decir, \(x_2 = x_1 + 0.2\), y los positivos quedan debajo. Observa que el algoritmo oscila: P2 y P4 se «pelean» la frontera durante tres épocas porque cada corrección para uno estropea al otro.

59.4.3 Formalización

La regla de actualización ante un error es

\[ \tilde{\mathbf{w}} \leftarrow \tilde{\mathbf{w}} + \eta\, y_i\, \tilde{\mathbf{x}}_i \quad \text{si } y_i\, \tilde{\mathbf{w}}^\top\tilde{\mathbf{x}}_i \le 0. \tag{59.6}\]

Tras la actualización, \(y_i\,\tilde{\mathbf{w}}^\top\tilde{\mathbf{x}}_i\) aumenta en \(\eta\|\tilde{\mathbf{x}}_i\|^2 > 0\): el punto queda «menos mal». Es un descenso de gradiente estocástico sobre la pérdida del perceptrón \(\max(0, -y\,g(\mathbf{x}))\), que vale cero para los puntos bien clasificados y crece linealmente con lo mal clasificados que están.

Teorema de convergencia (Novikoff 1962). Si los datos son linealmente separables con margen \(\gamma\) (existe un \(\mathbf{w}^{*}\) unitario con \(y_i\,\mathbf{w}^{*\top}\tilde{\mathbf{x}}_i \ge \gamma\) para todo \(i\)) y \(\|\tilde{\mathbf{x}}_i\| \le R\), el perceptrón comete a lo más \((R/\gamma)^2\) errores antes de encontrar un separador. Cuanto más «holgada» es la separación, más rápido converge.

Tres limitaciones motivan los modelos de los capítulos siguientes:

  • Si los datos no son separables, el perceptrón nunca se detiene: la frontera cicla indefinidamente. El caso clásico es el XOR (Minsky y Papert 1969), que ninguna recta separa y que llevó a las redes multicapa.
  • Si son separables, encuentra una frontera cualquiera, dependiente del orden de los datos; las máquinas de soporte vectorial buscan la de margen máximo.
  • No produce probabilidades; la regresión logística sí.

59.4.4 Laboratorio: el perceptrón paso a paso

Laboratorio · Perceptrón

¿Cuántas correcciones necesita la frontera?

Avanza punto por punto o época por época. El punto con anillo es el que se evalúa; si está mal clasificado, la frontera gira hacia él.

Datos
Avanzar
w̃ = (w₀, w₁, w₂)
Época
Actualizaciones
Errores con w̃ actual

Frontera actual

y = +1y = −1frontera g = 0w (hacia +1)

Últimas actualizaciones

Errores por época

Guía del laboratorio.

  1. Con Cuatro puntos, avanza punto por punto y comprueba cada fila de la Tabla 59.7.
  2. ¿Por qué después de corregir P2 en la época 1, el punto P4 queda mal clasificado?
  3. Predice antes de pulsar: con Separable (20), ¿cuántas épocas crees que necesitará? Usa Hasta converger.
  4. Con XOR, pulsa Hasta converger. Observa la gráfica de errores por época: ¿se estabiliza en cero?

59.5 Comparación

Mínimos cuadrados Fisher Perceptrón
Qué optimiza Suma de cuadrados del puntaje Separación de las proyecciones Pérdida del perceptrón
Solución Cerrada (ecuaciones normales) Cerrada (\(\mathbf{S}_W^{-1}\Delta\mathbf{m}\)) Iterativa
Datos no separables Sí Sí No converge
Sensible a puntos lejanos bien clasificados Sí Poco No
Probabilidades No Con supuestos gaussianos (LDA) No
Tabla 59.8: Tres maneras de elegir un clasificador lineal.

59.6 Implementación en Python

59.6.1 Regresión lineal

Mostrar código
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

x = np.array([1, 2, 3, 4, 5], dtype=float)
y = np.array([2, 3, 5, 4, 6], dtype=float)

# Ecuaciones normales con la matriz de diseño
X = np.column_stack([np.ones_like(x), x])
beta = np.linalg.solve(X.T @ X, X.T @ y)
print("β (ecuaciones normales):", beta.round(3))

modelo = LinearRegression().fit(x.reshape(-1, 1), y)
pred = modelo.predict(x.reshape(-1, 1))
print(f"β (scikit-learn): {modelo.intercept_:.3f}, {modelo.coef_[0]:.3f}")
pd.Series({"SSE": ((y - pred) ** 2).sum(), "MSE": mean_squared_error(y, pred),
           "RMSE": mean_squared_error(y, pred) ** 0.5, "MAE": mean_absolute_error(y, pred),
           "R²": r2_score(y, pred)}).round(3)
β (ecuaciones normales): [1.3 0.9]
β (scikit-learn): 1.300, 0.900
SSE     1.900
MSE     0.380
RMSE    0.616
MAE     0.480
R²      0.810
dtype: float64

Con varias variables, la interpretación de cada coeficiente es «manteniendo las demás constantes». Con el conjunto diabetes de scikit-learn (10 variables clínicas estandarizadas):

Mostrar código
import plotly.graph_objects as go
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

Xd, yd = load_diabetes(return_X_y=True, as_frame=True)
X_tr, X_te, y_tr, y_te = train_test_split(Xd, yd, test_size=0.3, random_state=0)
lr = LinearRegression().fit(X_tr, y_tr)
print(f"R² prueba: {r2_score(y_te, lr.predict(X_te)):.3f} · RMSE prueba: {mean_squared_error(y_te, lr.predict(X_te)) ** 0.5:.1f}")
print(pd.Series(lr.coef_, index=Xd.columns).round(1).sort_values().to_string())
fig = go.Figure(go.Scatter(x=lr.predict(X_te), y=y_te - lr.predict(X_te), mode="markers", marker=dict(color="#2563eb", size=6, opacity=0.7)))
fig.add_hline(y=0, line=dict(color="gray", dash="dash"))
fig.update_layout(xaxis_title="valor ajustado", yaxis_title="residuo", height=340, margin=dict(l=10, r=10, t=20, b=40))
fig.show()
R² prueba: 0.393 · RMSE prueba: 55.7
s1    -504.6
sex   -193.5
s3     -69.8
age    -52.5
s6      26.8
s4      86.6
s2     241.6
bp     272.5
bmi    579.5
s5     721.9
Figura 59.1: Residuos contra valores ajustados de la regresión lineal en el conjunto de prueba de diabetes. Una nube sin forma alrededor de cero es lo esperable; un embudo indicaría varianza no constante y una curva, una relación no lineal.

59.6.2 Discriminante de Fisher

Mostrar código
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

A = np.array([[1, 2], [2, 3], [3, 3]], dtype=float)
B = np.array([[4, 5], [5, 6], [6, 5]], dtype=float)
mA, mB = A.mean(axis=0), B.mean(axis=0)
SW = (A - mA).T @ (A - mA) + (B - mB).T @ (B - mB)
w = np.linalg.solve(SW, mA - mB)

def J(direccion):
    d = direccion / np.linalg.norm(direccion)
    zA, zB = A @ d, B @ d
    return (zA.mean() - zB.mean()) ** 2 / (((zA - zA.mean()) ** 2).sum() + ((zB - zB.mean()) ** 2).sum())

print("S_W =\n", SW.round(3))
print("w de Fisher (sin normalizar):", w.round(3), "· normalizada:", (w / np.linalg.norm(w)).round(3))
print(f"J(Fisher) = {J(w):.3f}   J(diferencia de medias) = {J(mA - mB):.3f}")

lda = LinearDiscriminantAnalysis().fit(np.vstack([A, B]), [0, 0, 0, 1, 1, 1])
coef = lda.coef_[0]
print("Dirección de LDA en scikit-learn (normalizada):", (coef / np.linalg.norm(coef)).round(3))
S_W =
 [[4.    1.   ]
 [1.    1.333]]
w de Fisher (sin normalizar): [-0.308 -1.769] · normalizada: [-0.171 -0.985]
J(Fisher) = 5.641   J(diferencia de medias) = 4.222
Dirección de LDA en scikit-learn (normalizada): [0.171 0.985]

La dirección de LinearDiscriminantAnalysis es la misma (con el signo opuesto, porque apunta hacia la clase 1).

59.6.3 El perceptrón

Mostrar código
def perceptron(X, y, eta=1.0, max_epocas=100):
    Xa = np.column_stack([np.ones(len(X)), X])
    w, traza = np.zeros(Xa.shape[1]), []
    for epoca in range(1, max_epocas + 1):
        errores = 0
        for i, (xi, yi) in enumerate(zip(Xa, y)):
            if yi * (w @ xi) <= 0:
                w = w + eta * yi * xi
                errores += 1
                traza.append({"época": epoca, "punto": f"P{i + 1}", "w después": tuple(w)})
        if errores == 0:
            return w, epoca, pd.DataFrame(traza)
    return w, None, pd.DataFrame(traza)

Xp = np.array([[2, 1], [3, 4], [1, 3], [4, 2]], dtype=float)
yp = np.array([1, -1, -1, 1])
w, epocas, traza = perceptron(Xp, yp)
print(f"Convergió en la época {epocas} con w̃ = {w}")
traza
Convergió en la época 4 con w̃ = [ 1.  5. -5.]
época punto w después
0 1 P1 (1.0, 2.0, 1.0)
1 1 P2 (0.0, -1.0, -3.0)
2 1 P4 (1.0, 3.0, -1.0)
3 2 P2 (0.0, 0.0, -5.0)
4 2 P4 (1.0, 4.0, -3.0)
5 3 P2 (0.0, 1.0, -7.0)
6 3 P4 (1.0, 5.0, -5.0)

scikit-learn incluye Perceptron. Con datos XOR no converge, como ningún clasificador lineal:

Mostrar código
from sklearn.linear_model import Perceptron

X_xor = np.array([[0, 0], [1, 1], [0, 1], [1, 0]])
y_xor = np.array([-1, -1, 1, 1])
for nombre, (Xs, ys) in {"cuatro puntos separables": (Xp, yp), "XOR": (X_xor, y_xor)}.items():
    p = Perceptron(max_iter=1000, tol=None, random_state=0).fit(Xs, ys)
    print(f"{nombre:>26}: exactitud en entrenamiento = {p.score(Xs, ys):.2f}")
  cuatro puntos separables: exactitud en entrenamiento = 1.00
                       XOR: exactitud en entrenamiento = 0.50

59.7 Resumen

  • Un modelo lineal resume cada caso en un puntaje \(\mathbf{w}^\top\mathbf{x} + w_0\); para clasificar se mira su signo y la frontera es un hiperplano perpendicular a \(\mathbf{w}\).
  • Mínimos cuadrados minimiza la suma de residuos al cuadrado; tiene solución cerrada \((\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top\mathbf{y}\) y se evalúa con MSE, RMSE, MAE y \(R^2\). Es sensible a puntos extremos.
  • Fisher proyecta sobre la dirección \(\mathbf{S}_W^{-1}(\mathbf{m}_A - \mathbf{m}_B)\), que maximiza la separación de las medias en relación con la dispersión dentro de las clases; no es la diferencia de medias cuando las clases están correlacionadas.
  • El perceptrón corrige la frontera con cada error; converge si los datos son linealmente separables, en a lo más \((R/\gamma)^2\) errores, y cicla si no lo son (XOR).
  • La regresión logística (capítulo siguiente) resuelve las limitaciones de los tres: da probabilidades, converge siempre y no castiga a los puntos bien clasificados.

Referencias