Corso di Laurea Magistrale in Informatica
Appunti di Machine Learning And
Pattern Recognition
Anno Accademico 2025/2026
Studente: Emmanuel Messina
Politecnico Di Torino
Indice
1 Librerie Numeriche in Python 4
1.1 Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 Machine Learning e Pattern Recognition: Fondamenti e Applicazioni 19
2.1 Introduzione al Machine Learning e al Pattern Recognition . . . . . . . . . . . . . . 19
2.2 Tipologie di Problemi Affrontati nel Machine Learning . . . . . . . . . . . . . . . . . 19
2.3 Tipologie di Apprendimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4 Processo di Classificazione dei Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Valutazione della qualità delle predizioni . . . . . . . . . . . . . . . . . . . . . . . . . 26
3 Dimensionality Reduction 29
3.1 Concetti preliminari di algebra lineare . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Principal Component Analysis (PCA) . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3 Analisi Lineare Discriminante (LDA) . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Introduzione alla Probabilità 57
4.1 Probabilità e Stima della Densità: Concetti Fondamentali . . . . . . . . . . . . . . . 57
4.2 Probabilità Condizionata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3 Variabili Casuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.4 Variabili Casuali Discrete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.5 Variabili Casuali Continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.6 Vettori Casuali e Distribuzioni Congiunte . . . . . . . . . . . . . . . . . . . . . . . . 68
4.7 Valore Atteso e Varianza delle Variabili Casuali . . . . . . . . . . . . . . . . . . . . . 72
4.8 Distribuzioni Discrete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.9 Distribuzioni Continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.10 Approccio Frequentista e Approccio Bayesiano . . . . . . . . . . . . . . . . . . . . . 80
4.11 Stima della Densità per Variabili Continue: Il Modello Gaussiano . . . . . . . . . . . 84
5 Generative Gaussian Model 89
5.1 Modelli Gaussiani Generativi: Principi di Classificazione Bayesiana . . . . . . . . . . 89
5.2 Gaussian Classifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.3 Classificazione binaria e posterior ratio . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.4 Classificazione Bayesiana Multiclasse . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.5 Classificatore Naive Bayes Gaussiano . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.6 Modello Gaussiano con Covarianza Condivisa . . . . . . . . . . . . . . . . . . . . . . 103
5.7 Considerazioni Pratiche e Trasformazione dei Dati . . . . . . . . . . . . . . . . . . . 106
5.8 Analisi delle Prestazioni Multiclasse . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
6 Modelli generativi multinomiali 109
6.1 Modelli Generativi Multinomiali: Modellazione di Valori Discreti . . . . . . . . . . . 109
6.2 Modellazione con più attributi categoriali . . . . . . . . . . . . . . . . . . . . . . . . 114
6.3 Log-Likelihood Ratio nel caso binario (due classi) . . . . . . . . . . . . . . . . . . . . 115
6.4 Considerazioni pratiche: parole rare e smoothing . . . . . . . . . . . . . . . . . . . . 117
1
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
7 Bayes Decisions e Model evaluation 119
7.1 MAP e le sue limitazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.2 Bayes Risk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
7.3 Detection Cost Function( DCF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.4 Decisione bayesiana ottimale e soglia . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
7.5 Score Calibration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
8 Logistic Regression 143
8.1 Regressione logistica: introduzione e fondamenti . . . . . . . . . . . . . . . . . . . . 143
8.2 Stima tramite massima verosimiglianza . . . . . . . . . . . . . . . . . . . . . . . . . . 145
8.3 Riformulazione della funzione obiettivo con etichette binarie simmetriche . . . . . . . 148
8.4 Calibrazione a priori e regressione logistica pesata . . . . . . . . . . . . . . . . . . . 153
8.5 Estensione multiclass della Logistic Regression . . . . . . . . . . . . . . . . . . . . . 154
8.6 Logistic Regression e confronto con Gaussian Classifier . . . . . . . . . . . . . . . . . 157
9 Support Vector Machine (SVM) 160
9.1 Introduzione alle SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
9.2 Primal SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
9.3 Dual SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
9.4 Condizioni di Ottimalità: le KKT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
9.5 Soft Margin SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
9.6 Il Kernel Trick e le Trasformazioni Non Lineari . . . . . . . . . . . . . . . . . . . . . 178
9.7 Considerazioni sulle SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
10 Gaussian Mixture Models 186
10.1 Introduzione ai Gaussian Mixture Models (GMM) . . . . . . . . . . . . . . . . . . . 186
10.2 Approssimazione tramite Hard Assignment . . . . . . . . . . . . . . . . . . . . . . . 188
10.3 Approssimazione tramite Soft Assignment . . . . . . . . . . . . . . . . . . . . . . . . 193
10.4 GMM per la Classificazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
10.5 L’Algoritmo LBG (Linde-Buzo-Gray) . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
10.6 Selezione del Modello (Model Selection) . . . . . . . . . . . . . . . . . . . . . . . . . 208
11 Score Calibration 210
11.1 Misscalibrazione dei punteggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
11.2 Modelli Generativi per la Calibrazione dei Punteggi . . . . . . . . . . . . . . . . . . 212
11.3 Architettura e Partizione dei Dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
11.4 K-fold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
11.5 Point Fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
11.6 Calibrazione e Fusione per Problemi Multiclasse . . . . . . . . . . . . . . . . . . . . 221
Prima di iniziare a studiare da questi appunti è necessario che tu sappia che, nonos-
Premessa
tante si sia cercato di fare gli appunti nel miglior modo possibile sia per ripassare al meglio e
sia per poter creare un materiale utile per altri studenti, che ci potrebbero ugualmente essere
imprecisioni, errori di scrittura o altro. In caso di problemi si prega di contattarmi via mail:
s333951@studenti.polito.it, su instagram: oppure sul canale telegram:
@emmanuelmessina00
Se vuoi sostenere il lavoro svolto, puoi offrirmi un caffè (1 euro) qui:
CLICCA QUI. CLICCA
QUI. 2
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
Ti lascio anche il profilo github in modo che ti possa confrontare con il codice: CLICCA QUI
3
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
1 Librerie Numeriche in Python
Le librerie numeriche sono NumPy e SciPy. Queste due librerie ci abilitano l’utilizzo di array multi-
dimensionali (servono ad esempio per la classificazione di immagini), algebra lineare, ottimizzazione
numerica e molti algoritmi di Machine Learning. Iniziamo con Numpy.
1.1 Numpy
è una libreria Python utilizzata per lavorare con gli array. Ha anche funzioni per lavorare
NumPy
nel dominio dell’algebra lineare, trasformata di Fourier e matrici. NumPy è stato creato nel 2005
da Travis Oliphant. È un progetto open source e puoi usarlo liberamente. NumPy è l’acronimo
di Numerical Python. In Python abbiamo liste che servono allo scopo di array, ma sono lente da
elaborare. NumPy mira a fornire un oggetto array che è fino a 50 volte più veloce di liste Python
tradizionali. L’oggetto array in NumPy si chiama ndarray e fornisce molte funzioni di supporto
che rendono il lavoro molto semplice. La maggior parte delle parti che richiedono un calcolo veloce
sono scritte in C o C++.
Gli oggetti principali di questa libreria sono array multidimensionali (di classe:
ndarray ndar-
Gli array sono spesso usati per collezioni monodimensionali. Con numpy.array rappresentiamo
ray).
gli array. Le dimensioni sono chiamate assi. Un array monodimensionale ha un asse, bidimensionale
ne ha due e così via. Non confondere il vettore bidimensionale con la classe matrix.
>>> numpy . array ([1 ,2 ,3])
1 array ([1 ,2 ,3])
2 >>> numpy . array ([[1 ,2 ,3] , [4 ,5 ,6]])
3 array ([[1 , 2 , 3] ,
4 [4 , 5 , 6]])
5 Gli Arrays hanno attributi che descrivono le caratteristiche:
• ritorna la dimensione dell’array
ndarray.size:
• ritorna una tupla con le dimensioni dell’array, se la matrice è m x n avremo
ndarray.shape:
una tupla (m,n)
• ritorna il numero degli assi
ndarray.ndim:
• ritorna il tipo di dati
ndarray.dtype:
>>> x = numpy . array ([1 ,2 ,3])
1 >>> x . size
2 3
3 >>> x . shape
4 (3 ,)
5 >>> y = numpy . array ([[1 ,2 ,3] , [4 ,5 ,6]])
6 >>> y . shape
7 (2 , 3)
8 >>> y . size
9 6
10 >>> y . ndim
11 2
12 4
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
Per creare un array ci sono vari modi:
Creazione array
Da una lista o tupla python possiamo dare in pasto a numpy.array per creare un array.
.array
Possiamo forzare il tipo mettendo come parametri oltre alla lista dtype=numpy.tipochevogliamo.
>>> numpy . array ([1 ,2 ,3] , dtype = numpy . float64 )
1 array ([ 1. , 2. , 3.])
2 Possiamo passare un array ad un altro array per copiarlo.
>>> y = numpy . array ( x )
1 Si possono usare funzioni per creare array predefiniti:
zero, ones, arrange, eye, linspace
• crea un array di soli 0
zeros:
• crea un array di soli 1
ones:
• crea un array di una sequenza ordinata di elementi che iniziano da 0 al numero
arrange:
passato nei parametri. Si può anche mettere un range diverso con la dimensione di quanto
distano gli elementi tra loro, senza è automaticamente 1, andando ad inserire 3 parametri,
punto di inizio, punto di fine, distanza .
• crea un array pluri-dimensionale che simula una matrice identità.
eye:
• dati tre parametri, punto di inizio, punto di fine, numero di punti, crea un array
linspace:
di elementi distanti in modo omogeneo in base al terzo parametro tra il punto di inizio e il
punto di fine.
>>> numpy . zeros ((2 , 3) , dtype = numpy . float32 )
1 array ([[ 0. , 0. , 0.] ,
2 [ 0. , 0. , 0.]] , dtype = float32 )
3 >>> numpy . ones (5)
4 array ([ 1. , 1. , 1. , 1. , 1.])
5 >>> numpy . arange (4)
6 array ([0 , 1 , 2 , 3])
7 >>> numpy . eye (3)
8 array ([[ 1. , 0. , 0.] ,
9 [ 0. , 1. , 0.] ,
10 [ 0. , 0. , 1.]])
11 È possibile accedere a un elemento della matrice facendo
Accesso agli elementi dell’array
riferimento al relativo numero di indice. Gli indici negli array NumPy iniziano con 0, il che significa
che il primo elemento ha indice 0 e il secondo ha indice 1 ecc.
arr = numpy . array ([1 , 2 , 3 , 4])
1 print ( arr [0])
2 Per accedere agli elementi da array 2D possiamo utilizzare numeri interi separati da virgole che
rappresentano Le dimensione e l’indice dell’elemento.
5
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
import numpy as np
1
2 arr = np . array ([[1 ,2 ,3 ,4 ,5] , [6 ,7 ,8 ,9 ,10]])
3
4 print ( ’2 nd element on 1 st row : ’ , arr [0 , 1])
5 print ( ’5 th element on 2 nd row : ’ , arr [1 , 4])
6 Per accedere agli elementi da array 3D possiamo utilizzare interi separati da virgole che rappresen-
tano le dimensioni e l’indice dell’elemento.
import numpy as np
1
2 arr = np . array ([[[1 , 2 , 3] , [4 , 5 , 6]] , [[7 , 8 , 9] , [10 , 11 , 12]]])
3
4 print ( arr [0 , 1 , 2])
5 Possiamo combinare gli arrays con operazioni aritmetiche. Dati due
Operazioni tra array
array possiamo sommarli tra loro o moltiplicarli ad esempio (Nota bene, è diverso dal concetto di
moltiplicazione tra matrici). La stessa cosa vale per sottrazione o divisione. Per modificare un
array esistente possiamo usare gli operatori *=, += ecc.
>>> x = numpy . array ([[1 ,2 ,3] , [4 ,5 ,6]])
1 >>> y = numpy . array ([[2 ,2 ,2] , [3 ,3 ,3]])
2 >>> x + y
3 array ([[3 , 4 , 5] ,
4 [7 , 8 , 9]])
5 >>> x * y
6 array ([[ 2 , 4 , 6] ,
7 [12 , 15 , 18]])
8 Il prodotto tra matrici come lo intendiamo matematicamente può essere fatto attraverso la funzione
Ricordare che il numero di colonne della prima matrice deve essere uguale al numero di righe
dot.
della seconda matrice.
>>> x = numpy . array ([[1 ,2] , [3 ,4] , [5 ,6]])
1 >>> y = numpy . array ([[1 ,2 ,3] , [4 ,5 ,6]])
2 >>> numpy . dot (x , y )
3 array ([[ 9 , 12 , 15] ,
4 [19 , 26 , 33] ,
5 [29 , 40 , 51]])
6 La funzione è un metodo che consente di cambiare la forma di un array esistente in
reshape
una nuova forma specificata. La nuova forma deve avere lo stesso numero totale di elementi del-
l’array originale, poiché i dati dell’array rimangono invariati. È possibile trasformare un array
monodimensionale in un array bidimensionale o tridimensionale.
>>> x = numpy . array ([[1 ,2] , [3 ,4] , [5 ,6]])
1 >>> x
2 array ([[1 , 2] ,
3 [3 , 4] ,
4 [5 , 6]])
5 >>> y = x . reshape ((2 ,3) )
6 >>> y
7 array ([[1 , 2 , 3] ,
8 [4 , 5 , 6]])
9 Possiamo utilizzare per creare vettori di riga e colonna
reshape 6
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
>>> x = numpy . arange (3)
1 >>> x
2 array ([0 , 1 , 2])
3 >>> x . reshape ((1 , x . size ) )
4 array ([[0 , 1 , 2]])
5 >>> x . reshape (( x . size , 1) )
6 array ([[0] ,
7 [1] ,
8 [2]])
9 Il metodo fa un reshape su un array multidimensionale trasformandolo in uno monodimen-
ravel
sionale.
>>> x = numpy . arange (12) . reshape ((2 ,2 ,3) )
1 >>> x
2 array ([[[ 0 , 1 , 2] ,
3 [ 3 , 4 , 5]] ,
4 [[ 6 , 7 , 8] ,
5 [ 9 , 10 , 11]]])
6 >>> x . ravel ()
7 array ([ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
8 10 , 11])
9 Nello studio delle librerie numeriche e nella ma-
Dimensionalità e organizzazione dei dati
nipolazione dei dati, è fondamentale distinguere accuratamente le diverse dimensionalità degli array.
Un errore comune consiste nel confondere gli array monodimensionali, caratterizzati da una forma
o shape pari a (n, ), con i vettori riga veri e propri, che possiedono invece una struttura bidimen-
sionale con shape pari a (1, In NumPy, un array monodimensionale rappresenta una semplice
n).
sequenza di valori senza un orientamento geometrico rigoroso, motivo per cui è essenziale definire
esplicitamente la dimensionalità quando si eseguono operazioni di algebra lineare.
Per quanto concerne l’organizzazione strutturale dei dataset, l’approccio matematico classico prevede
la rappresentazione dei singoli dati sotto forma di vettori colonna. Seguendo questa logica, le matri-
ci complessive vengono costruite attraverso l’affiancamento, ovvero lo stacking orizzontale, di questi
vettori colonna continui. È molto importante tenere presente che questa metodologia differisce dalla
convenzione opposta, largamente adottata in svariate librerie di Machine Learning, dove i singoli
punti dati sono invece rappresentati come vettori riga e le matrici si ottengono impilandoli verti-
calmente uno sull’altro.
L’utilizzo dei vettori colonna offre il grande vantaggio di mantenere una corrispondenza naturale e
diretta con la notazione matematica standard. Ad esempio, la classica operazione di trasformazione
lineare viene scritta e implementata fedelmente come = Tuttavia, questa scelta architetturale
y Ax.
può comportare un lieve calo delle prestazioni computazionali. Le operazioni risultano infatti leg-
germente più lente a causa dell’accesso in memoria, a meno che non si forzi esplicitamente un
ordinamento in stile Fortran, noto anche come column-major ordering.
Al contrario, l’impiego dei vettori riga garantisce che gli elementi appartenenti a un singolo dato
siano disposti in posizioni di memoria rigorosamente consecutive, seguendo l’ordinamento predefini-
to del linguaggio C, ovvero il row-major ordering. Questa contiguità spaziale permette alla CPU
di eseguire diverse operazioni matriciali in modo leggermente più veloce ed efficiente. Un ulteriore
7
Emmanuel Messina - Machine Learning and Pattern Recognition 2025/2026
aspetto pratico a favore della struttura a righe riguarda l’iterazione del codice: una matrice di
dati formattata in questo modo può essere scorsa e analizzata agevolmente utilizzando un semplice
ciclo for. Bisogna in ogni caso prestare attenzione al comportamento interno della libreria, poiché
durante questa iterazione gli elementi estratti e restituiti da NumPy saranno a tutti gli effetti degli
array monodimensionali, e non manterranno la forma originaria di vettori riga bidimensionali.
Per comprendere a fondo la differenza pratica tra queste rappresentazioni, è utile analizzare di-
rettamente il comportamento degli array in memoria attraverso degli
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti AI: Machine Learning and Pattern Recognition
-
Appunti Machine Learning
-
Machine Learning
-
Schema appunti completi per il corso di Machine Learning