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.
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
- 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.
- Configuración: Leer el entero \(H\) (dimensión de los histogramas), la string \(M\) (métrica:
euclidianaomanhattan) y el entero impar \(k\). - 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).
- 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).
- 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|. \]
- 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.
- 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.
- Precisión: Calcule la precisión global como la razón entre aciertos y \(Q\).
- 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. |
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.
%%writefile EP07_06.py
# Código PythonOverwriting 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.