← TUTTI I PROGETTI

MACHINE LEARNING & RECOMMENDER SYSTEMS · 2026

Matrix Completion su MovieLens

Un confronto tra SVP, SVT, una variante di ADMiRA e due baseline per stimare i rating mancanti. Nel nostro esperimento, una baseline regolarizzata ha ottenuto i risultati migliori.

PythonNumPyMatrix CompletionModel Evaluation
ESPLORA IL CODICE SU GITHUB ↗
Rating MovieLens100.836610 utenti · 9.724 film valutati
Configurazioni confrontate11Tre metodi low-rank e due baseline
RMSE finale sul test0,878Solo per il modello scelto sulla validation

01 / IL PROBLEMA

Come stimare i voti che mancano?

Questo progetto nasce da un lavoro universitario svolto con Matteo Mancini. Abbiamo studiato un problema comune nei sistemi di raccomandazione: ogni utente valuta soltanto una piccola parte dei film disponibili. Il resto della matrice è vuoto.

COME SI PRESENTANO I DATIEsempio inventato, non estratto da MovieLens
Film 1
Film 2
Film 3
Film 4
Film 5
Film 6
Utente 1
4
?
3
?
5
?
Utente 2
?
2
?
4
?
?
Utente 3
5
?
?
3
?
4
Utente 4
?
4
2
?
?
?
Ogni riga rappresenta un utente, ogni colonna un film. I numeri sono voti già osservati; i punti interrogativi sono quelli che vorremmo prevedere. Nei dati reali la matrice è molto più grande e sparsa.

L'idea alla base della matrix completion è che le preferenze degli utenti possano essere descritte, almeno in parte, da poche caratteristiche latenti. Abbiamo voluto capire quanto funzionasse questa ipotesi sul dataset MovieLens Latest Small.

02 / IL METODO

Confrontare i modelli senza usare il test per sceglierli

Abbiamo confrontato SVP, SVT e una variante didattica ispirata ad ADMiRA. A questi abbiamo affiancato due riferimenti semplici: la media globale dei rating e un modello che tiene conto degli effetti dei singoli utenti e film.

Esplora gli algoritmiSeleziona un metodo per vedere come ragiona
BASELINE

Bias utente–film

0,861
RMSE validation ↓

Parte dalla media generale e la corregge in base all'utente e al film.

COME FUNZIONA, IN TRE PASSAGGI
  1. Stima la media globale sul training.
  2. Stima un effetto per ciascun utente e ciascun film.
  3. Regolarizza gli effetti per ridurre il rischio di adattarsi troppo ai dati.

Esempio: Un utente tende a dare voti alti? Un film riceve spesso voti bassi? Il modello tiene conto di entrambe le tendenze.

Come potrebbe apparire una piccola matrice di previsioni
3,2
3,7
4,1
2,6
3,1
3,5
3,7
4,2
4,6
Illustrazione inventata per mostrare la logica del metodo: non sono previsioni prodotte dal codice del progetto. I valori reali di RMSE sono riportati sopra.
Pseudocodice e notazione matematica
I passaggi principali, semplificati a partire dal codice del progetto. μ\mu è la media globale; bub_u e bib_i sono gli effetti dell’utente e del film; λ\lambda controlla la regolarizzazione. Ωu\Omega_u e Ωi\Omega_i indicano rispettivamente i voti disponibili per quell’utente e quel film.
  1. μ←media⁡(MΩ)\mu\leftarrow \operatorname{media}(M_{\Omega})
  2. bu,bi←0b_u,b_i\leftarrow 0
  3. Ripeti fino al criterio di arresto:
  4. bu←∑i∈Ωu(Mui−μ−bi)λ+∣Ωu∣b_u\leftarrow \frac{\sum_{i\in\Omega_u}(M_{ui}-\mu-b_i)}{\lambda+|\Omega_u|}
  5. bi←∑u∈Ωi(Mui−μ−bu)λ+∣Ωi∣b_i\leftarrow \frac{\sum_{u\in\Omega_i}(M_{ui}-\mu-b_u)}{\lambda+|\Omega_i|}
  6. Controlla la variazione dei parametri.
  7. r^ui←μ+bu+bi\hat r_{ui}\leftarrow\mu+b_u+b_i

Le implementazioni includono ulteriori controlli numerici e criteri di arresto. SVT usa una variante prossimale; ADMiRA è una variante didattica, non l'algoritmo canonico.

Punto di forza

Cattura differenze sistematiche con pochi elementi interpretabili.

Limite

Non rappresenta direttamente le interazioni personali tra un utente e uno specifico film.

LABORATORIO INTERATTIVO

Un aggiornamento alla volta

Qui i numeri sono calcolati nel browser su una matrice sintetica 2×2. Non sono i risultati di MovieLens. Puoi provare tutti e cinque i metodi: a ogni clic viene calcolato un nuovo aggiornamento. I parametri sono scelti per questo esempio, non quelli ottimizzati su MovieLens.

Come usarlo: scegli uno dei cinque metodi, poi premi «Iterazione successiva». A ogni passo confronta la stima con i tre voti conosciuti. Il quarto voto è nascosto: il modello lo deve stimare senza conoscere il valore vero.

SVP: conserva una componente singolare (rango 1). Cambiare metodo riavvia la simulazione.

Voti osservati
5,00
4,00
2,00
?

Il punto interrogativo non entra nel calcolo degli errori.

Stima dopo 0 aggiornamenti
0,00
0,00
0,00
0,00

La cella arancione è il voto da stimare.

Passo 0/20 · Errore sui tre voti conosciuti: 3,87
Cosa farà il prossimo clic? Dal passo 0 al passo 1

1. Calcoliamo gli errori sui tre voti noti. Con passo 1 correggiamo le tre celle osservate, lasciando invariata quella sconosciuta.

Matrice dopo la correzione degli errori
5,00
4,00
2,00
0,00
Risultato del prossimo aggiornamento
5,17
3,76
1,31
0,95

2. La matrice corretta ha valori singolari 6,60 e 1,21. Misurano il peso delle componenti SVD.

3. SVP mantiene la componente maggiore ed elimina la seconda: rango 1.

Se premi il pulsante, l’errore sui tre voti conosciuti passerà da 3,87 a 0,43. Questo non misura la qualità della previsione del voto nascosto.

Attenzione: l’RMSE sui voti conosciuti è un errore di addestramento, non un controllo della previsione mancante. Senza conoscere quel quarto voto non possiamo sapere se la stima sia corretta. I valori della matrice possono anche uscire dall’intervallo 0–5: qui non applichiamo limiti artificiali alle previsioni.

Dimostrazione numerica ridotta: schema didattico calcolato per tutti e cinque i metodi; per ADMiRA-inspired il passo di selezione è ridotto a una sola direzione e non replica il solver originale, ma dimensioni e parametri scelti per essere leggibili. L'RMSE mostrato è sul piccolo esempio osservato, non sulla validation del progetto.

COME ABBIAMO SEPARATO I DATI
Training
70.58570% dei rating
Validation
15.12515% dei rating
Test
15.12615% dei rating
Split casuale a livello di rating, con seed fissato. La validation serve a scegliere il modello; il test rimane separato fino alla valutazione finale. Non è uno split per utente o cronologico.

Il criterio di confronto è l'RMSE, la radice dell'errore quadratico medio. Penalizza maggiormente gli errori grandi: se prevediamo 4 stelle quando il voto reale è 2, l'errore pesa più di una previsione sbagliata di mezza stella.

LA METRICA UTILIZZATA
RMSE⁡=1n∑i=1n(y^i−yi)2\operatorname{RMSE}=\sqrt{\frac{1}{n}\sum\limits_{i=1}^{n}(\hat y_i-y_i)^2}

Tutti i modelli sono stati confrontati sugli stessi rating di validation. Abbiamo poi valutato una sola volta sul test il modello selezionato.

03 / I RISULTATI

La baseline regolarizzata è risultata la migliore

Tra i tre metodi di matrix completion, SVP con rango 5 ha ottenuto l'RMSE più basso sulla validation. Ma il modello con effetti utente–film, molto più semplice, ha fatto meglio di tutti.

CONFRONTO SULLA VALIDATIONRMSE ↓ più basso è meglio
Bias utente–film (λ=5\lambda=5)0,861
Media globale1,035
SVP (rango 5)1,389
ADMiRA, variante didattica (rango 2)1,491
SVT (soglia 30)1,719
Per ogni famiglia è mostrata la configurazione con il miglior RMSE sulla validation, non tutte le 11 configurazioni provate. I valori provengono dai risultati registrati del progetto; non sono stime ricostruite per questa pagina. Non sono disponibili RMSE sul test per gli altri modelli.

Il modello selezionato è stato quindi valutato sui 15.126 rating del test finale, ottenendo un RMSE di 0,8781. Sui film già presenti nel training l'RMSE è stato 0,8713; sui 701 rating relativi a film non osservati nel training è salito a 1,0068.

Questi numeri suggeriscono che prevedere i rating di film non visti durante l'addestramento è più difficile. Non dimostrano, invece, che le baseline siano sempre migliori dei metodi low-rank: il risultato riguarda le implementazioni e le configurazioni che abbiamo effettivamente provato.

04 / CODICE E VERIFICHE

Che cosa si può controllare nel repository

Abbiamo pubblicato codice, configurazioni, risultati registrati e test automatici. Il repository distingue i controlli eseguibili senza MovieLens da quelli che richiedono l'archivio originale. Quando manca, questi ultimi vengono segnalati come saltati, non come superati.

Alcuni algoritmi hanno raggiunto il numero massimo di iterazioni; non dichiariamo quindi una convergenza che non abbiamo verificato. La CI controlla il codice e gli artefatti offline, ma non ripete l'intero esperimento né dimostra un isolamento del processo a livello di sistema operativo.

CODICE, RISULTATI E DOCUMENTAZIONE SU GITHUB ↗