PDI+VC · Ejercicio de Programación

EP07_06 — 🟣 Pipeline Completo: Descriptores + k-NN + Evaluación Multiclase

7.18.6 EP07_06 🟣 Pipeline Completo: Descriptores + k-NN + Evaluación Multiclase

Este ejercicio integra las tres etapas centrales del capítulo en un único pipeline, reproduciendo en miniatura el Proyecto Práctico 2 (clasificación de texturas sintéticas por LBP): un conjunto de histogramas de descriptores ya extraídos (como si fueran histogramas LBP) se utiliza para entrenar un clasificador k-NN, que a su vez se evalúa sobre un conjunto de prueba independiente mediante una matriz de confusión multiclase.

A diferencia de EP07_01, aquí el espacio de características tiene dimensión arbitraria \(H\) (el tamaño del histograma), existen más de dos clases, y la métrica de distancia es un parámetro de entrada — lo que permite reproducir el experimento de comparación de métricas discutido en el capítulo.

7.18.6.1 📋 Directrices de Implementación

  1. Clases: Leer el entero \(C\) (número de clases) seguido de \(C\) nombres de clase (strings sin espacio), en el orden en que deben aparecer en la matriz de confusión.
  2. Configuración: Leer el entero \(H\) (dimensión de los histogramas), la string \(M\) (métrica: euclidiana o manhattan) y el entero impar \(k\).
  3. Entrenamiento: Leer el entero \(N\) y, a continuación, \(N\) líneas, cada una conteniendo el nombre de la clase seguido de \(H\) valores reales (el histograma de descriptor).
  4. Prueba: Leer el entero \(Q\) y, a continuación, \(Q\) líneas, cada una conteniendo el nombre de la clase real seguido de \(H\) valores reales (el histograma de descriptor de la muestra de prueba).
  5. Distancia: Para cada muestra de prueba, calcule la distancia a cada ejemplo de entrenamiento usando la métrica \(M\): \[ d_{\text{euclidiana}}(u,v) = \sqrt{\sum_{j=1}^{H}(u_j-v_j)^2}, \qquad d_{\text{manhattan}}(u,v) = \sum_{j=1}^{H} |u_j - v_j|. \]
  6. Clasificación k-NN: Seleccione los \(k\) ejemplos de entrenamiento más cercanos (desempate de distancia por el orden de lectura, como en EP07_01) y clasifique por la clase mayoritaria entre ellos. En caso de empate de votación entre dos o más clases, elija la que aparezca primero en la lista de clases del ítem 1.
  7. Matriz de confusión: Construya una matriz \(C \times C\) en la que la fila corresponde a la clase real y la columna a la clase prevista, siguiendo el orden de clases del ítem 1.
  8. Precisión: Calcule la precisión global como la razón entre aciertos y \(Q\).
  9. Salida: Para cada muestra de prueba, en el orden de entrada, imprimir la clase prevista. A continuación, imprimir la matriz de confusión (una fila por clase real, valores separados por espacio, en el orden de las clases). Finalmente, imprimir la precisión redondeada a 4 decimales.

7.18.6.2 📌 Restricciones Computacionales

  • Métrica seleccionable: implemente ambas distancias; la métrica \(M\) define cuál se utiliza en toda la ejecución (no es posible mezclar métricas en la misma llamada).
  • Desempate de votación determinístico: el criterio del ítem 6 (orden de la lista de clases) debe seguirse incluso cuando el empate involucra más de dos clases.
  • Independencia de entrenamiento y prueba: no hay necesidad de validar que las muestras de prueba no aparecen en el entrenamiento — asuma que la entrada es válida.

7.18.6.3 🧠 Fundamentación Teórica

Etapa del ejercicio Etapa correspondiente en el capítulo
Histogramas de entrenamiento/prueba ya extraídos descritor_lbp aplicado a las texturas sintéticas
Distancia euclidiana o Manhattan Parámetro metric del KNeighborsClassifier
Votación mayoritaria con \(k\) vecinos KNeighborsClassifier.predict
Matriz de confusión \(C\times C\) confusion_matrix de scikit-learn
Precisión global accuracy_score de scikit-learn

Este ejercicio evidencia, de forma controlada, un resultado discutido en el capítulo: la elección de la métrica de distancia y del valor de \(k\) puede alterar la clase prevista para una misma muestra, incluso manteniendo fijo el descriptor utilizado — reforzando que, en el reconocimiento de patrones clásico, el descriptor, la métrica y el clasificador forman un sistema interdependiente, y no piezas aisladas.

7.18.6.4 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: entero \(C\) seguido de \(C\) nombres de clase.
  • Línea 2: entero \(H\), string \(M\) y entero \(k\).
  • Línea 3: entero \(N\).
  • Siguientes \(N\) líneas de entrenamiento: nombre de la clase seguido de \(H\) reales.
  • Siguiente línea: entero \(Q\).
  • Siguientes \(Q\) líneas de prueba: nombre de la clase real seguido de \(H\) reales.

Salida:

  • \(Q\) líneas con la clase prevista de cada muestra de prueba, en el orden de entrada.
  • \(C\) líneas con la matriz de confusión (una fila por clase real).
  • Última línea: Acuracia: <valor>.

7.18.6.5 📌 Ejemplos

Entrada (resumida) Salida Observación
2 granular listrada
2 euclidiana 1
4
granular 0.9 0.1
granular 0.8 0.2
listrada 0.1 0.9
listrada 0.2 0.8
2
granular 0.85 0.15
listrada 0.15 0.85
granular
listrada
1 0
0 1
Acuracia: 1.0000
Con \(k=1\), cada prueba se clasifica por el vecino de entrenamiento más cercano.
Nota

Este simulador usa un conjunto simplificado de 3 clases (granular, listrada, manchada) sobre puntos 2D fictícios, solo para ilustrar el pipeline de votación, desempate y matriz de confusión del k-NN. En el EP07_07, aplicarás esta misma lógica a un mosaico de imagen real, que introduce una cuarta clase (xadrez) y sustituye los puntos 2D por histogramas LBP extraídos directamente de los píxeles de la imagen.

🎮 Simulador EP07_06: Pipeline k-NN Multiclase 6 Entrenamiento · 3 Prueba · 3 Clases

Elija la métrica, el valor de k y la muestra de prueba (★). Vea los k vecinos más cercanos, la votación, el desempate cuando sea necesario, y cómo esto se propaga a la matriz de confusión y la precisión del conjunto completo.

Métrica (M)
Vecinos (k)
Muestra de prueba (★)
📏 Distancias a la muestra de prueba (ordenadas) — #i = orden de lectura en la lista de entrenamiento (pase el mouse)
🗳️ Votación entre los k vecinos
📋 Matriz de confusión y precisión — ejecutando el pipeline sobre las 3 muestras de prueba
Figura 7.26: Simulador EP07_06: Pipeline k-NN Multi-Clase (votación, desempate y matriz de confusión)
%%writefile EP07_06.py
# Código Python
Overwriting EP07_06.py
TestSuite("EP07_06.py").run()
✔️ EP07_06.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP07_06.cases

🔍 Probando Python: EP07_06.py
⚠️ EP07_06.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.