EDI+VA · Esercizio di Programmazione

EP07_06 — 🟣 Pipeline Completo: Descrittori + k-NN + Valutazione Multi-Classe

7.18.6 EP07_06 🟣 Pipeline Completo: Descrittori + k-NN + Valutazione Multi-Classe

Questo esercizio integra le tre fasi centrali del capitolo in un unico pipeline, riproducendo in miniatura il Progetto Pratico 2 (classificazione di trame sintetiche tramite LBP): un insieme di istogrammi di descrittori già estratti (come se fossero istogrammi LBP) viene utilizzato per addestrare un classificatore k-NN, che a sua volta viene valutato su un insieme di test indipendente mediante una matrice di confusione multi-classe.

A differenza dell’EP07_01, qui lo spazio delle caratteristiche ha dimensione arbitraria \(H\) (la dimensione dell’istogramma), esistono più di due classi e la metrica di distanza è un parametro di input — consentendo di riprodurre l’esperimento di confronto delle metriche discusso nel capitolo.

7.18.6.1 📋 Linee Guida di Implementazione

  1. Classi: Leggere l’intero \(C\) (numero di classi) seguito da \(C\) nomi di classe (stringhe senza spazi), nell’ordine in cui devono apparire nella matrice di confusione.
  2. Configurazione: Leggere l’intero \(H\) (dimensione degli istogrammi), la stringa \(M\) (metrica: euclidiana o manhattan) e l’intero dispari \(k\).
  3. Addestramento: Leggere l’intero \(N\) e, successivamente, \(N\) righe, ciascuna contenente il nome della classe seguito da \(H\) valori reali (l’istogramma del descrittore).
  4. Test: Leggere l’intero \(Q\) e, successivamente, \(Q\) righe, ciascuna contenente il nome della classe reale seguito da \(H\) valori reali (l’istogramma del descrittore del campione di test).
  5. Distanza: Per ogni campione di test, calcolare la distanza da ogni esempio di addestramento utilizzando la metrica \(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. Classificazione k-NN: Selezionare i \(k\) esempi di addestramento più vicini (in caso di parità di distanza, dare la precedenza all’ordine di lettura, come nell’EP07_01) e classificare in base alla classe maggioritaria tra di essi. In caso di pareggio di voti tra due o più classi, scegliere quella che appare per prima nella lista di classi del punto 1.
  7. Matrice di confusione: Costruire una matrice \(C \times C\) in cui la riga corrisponde alla classe reale e la colonna alla classe prevista, seguendo l’ordine delle classi del punto 1.
  8. Accuratezza: Calcolare l’accuratezza globale come rapporto tra i successi e \(Q\).
  9. Output: Per ogni campione di test, nell’ordine di input, stampare la classe prevista. Successivamente, stampare la matrice di confusione (una riga per classe reale, valori separati da spazi, nell’ordine delle classi). Infine, stampare l’accuratezza arrotondata a 4 cifre decimali.

7.18.6.2 📌 Vincoli Computazionali

  • Metrica selezionabile: implementare entrambe le distanze; la metrica \(M\) definisce quale viene utilizzata per l’intera esecuzione (non è possibile mescolare metriche nella stessa chiamata).
  • Pareggio di voti deterministico: il criterio del punto 6 (ordine della lista delle classi) deve essere seguito anche quando il pareggio coinvolge più di due classi.
  • Indipendenza tra addestramento e test: non è necessario verificare che i campioni di test non appaiano nell’addestramento — si assume che l’input sia valido.

7.18.6.3 🧠 Fondamenti Teorici

Fase dell’esercizio Fase corrispondente nel capitolo
Istogrammi di addestramento/test già estratti descritor_lbp applicato alle trame sintetiche
Distanza euclidea o Manhattan Parametro metric del KNeighborsClassifier
Votazione maggioritaria con \(k\) vicini KNeighborsClassifier.predict
Matrice di confusione \(C\times C\) confusion_matrix di scikit-learn
Accuratezza globale accuracy_score di scikit-learn

Questo esercizio evidenzia, in modo controllato, un risultato discusso nel capitolo: la scelta della metrica di distanza e del valore di \(k\) può modificare la classe prevista per lo stesso campione, anche mantenendo fisso il descrittore utilizzato — rafforzando l’idea che, nel riconoscimento di pattern classico, il descrittore, la metrica e il classificatore formano un sistema interdipendente, e non componenti isolate.

7.18.6.4 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: intero \(C\) seguito da \(C\) nomi di classe.
  • Riga 2: intero \(H\), stringa \(M\) e intero \(k\).
  • Riga 3: intero \(N\).
  • Prossime \(N\) righe di addestramento: nome della classe seguito da \(H\) reali.
  • Riga successiva: intero \(Q\).
  • Prossime \(Q\) righe di test: nome della classe reale seguito da \(H\) reali.

Output:

  • \(Q\) righe con la classe prevista per ogni campione di test, nell’ordine di input.
  • \(C\) righe con la matrice di confusione (una riga per classe reale).
  • Ultima riga: Acuracia: <valore>.

7.18.6.5 📌 Esempi

Input (riassunto) Output Osservazione
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\), ogni test viene classificato dal vicino di addestramento più prossimo.
Nota

Questo simulatore utilizza un insieme semplificato di 3 classi (granulare, a strisce, maculata) su punti 2D fittizi, unicamente per illustrare il pipeline di votazione, spareggio e matrice di confusione del k-NN. Nel EP07_07, applicherai questa stessa logica a un mosaico di un’immagine reale, che introduce una quarta classe (a scacchi) e sostituisce i punti 2D con istogrammi LBP estratti direttamente dai pixel dell’immagine.

🎮 Simulatore EP07_06: Pipeline k-NN Multi-classe 6 Addestramento · 3 Test · 3 Classi

Scegli la metrica, il valore di k e il campione di test (★). Osserva i k vicini più prossimi, la votazione, il pareggio quando necessario, e come ciò si propaga alla matrice di confusione e all'accuratezza dell'intero set.

Metrica (M)
Vicini (k)
Campione di test (★)
📏 Distanze fino al campione di test (ordinate) — #i = ordine di lettura nella lista di addestramento (passa il mouse)
🗳️ Votazione tra i k vicini
📋 Matrice di confusione e accuratezza — eseguendo il pipeline sui 3 campioni di test
Figura 7.26: Simulatore EP07_06: Pipeline k-NN Multi-Classe (votazione, spareggio e matrice di confusione)
%%writefile EP07_06.py
# Codice Python
Overwriting EP07_06.py
TestSuite("EP07_06.py").run()
✔️ EP07_06.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP07_06.cases

🔍 Test di Python: EP07_06.py
⚠️ EP07_06.py: file vuoto (meno di 3 righe). Test saltati.