 Buongiorno, oggi vi parlerò dei sistemi di raccomandazione, ovvero quei sistemi che vengono utilizzati da siti di vendita online per consigliare degli acquisti, raccomandare degli acquisti agli utenti in funzione degli acquisti che sono già stati fatti da quegli utenti. Alla parlerò ovviamente dal punto di vista del matematico. Abbiamo bisogno però di introdurre alcuni concetti di base per capire meglio l'esempio che andremo a fare dopo. Prima concetto da definire quello di matrice e poi la sua generalizzazione a quello di tensore. Alla che cos'è la matrice? Fissiamo M e N due interi positivi e andiamo a costruire una tabella con M rile ed N colonne due indicherò a 1 1 fino a 1 N e via via a M 1 a M N. Le M per N entrate di questa matrice. Dicheremo la matrice semplicemente con A. Che cosa metto in queste entrate? Beh possono essere funzioni, possono essere polinomi ma possono essere anche più semplicemente numeri. Noi siamo interessati soprattutto al caso numerico. Quindi diremo che la mia matrice è a valori sui reali. Se questi i valori sono tutti reali sui complessi, se invece questi i valori sono anche complessi, ma in generale in matematici diremo che A è una matrice a valori in un campo K. Seconda poi le cose sarà il nostro campo K. Bene, a noi quello che ci interessa è andare a capire quella che viene chiamata la prossimazione di rango di una matrice. Alla per quanto riguarda le matrici ci sono molti modi di definire il rango di una matrice, ne sfruttiamo solo una perché quella si generalizza anche al caso di tensori. E andiamo a prendere quindi abbiamo una matrice M per N. Allora prendiamo B un vettore con M coordinate e W un vettore con N coordinate. Bene, allora costruiamo questo, una matrice in questo modo, questo si chiama prodotto tensoriale di W W. Cosa ottengo? Ottengo una matrice che è fatta così. Prendiamo il vettore B e ricopiamolo 1 W M su N per N volte, dove N me lo dice la dimensione del mio vettore W. Dopodiché la prima colonna la montipico per W1 tutta, la seconda colonna la montipicarò per W2, l'ultima e così via la terza per W3 e l'ultima per WM. Osservate che è la stessa cosa se io scrivevo questo vettore su tutte le righe, su M righe e poi moltiplicavo la prima riga per la prima entrada del vettore B, la seconda riga, la seconda coordinata del vettore B e fino all'ennesima riga la moltiplicavo per l'ultima coordinata all'ennesima del vettore B. Quindi cosa che io questo graficamente potrei scrivere in questo modo, ho fatto un prodotto tra il vettore W e il vettore WDoppio e ho ottenuto una matrice. Ora questa ma matrice particolare prende il nome di matrice decomponibile o matrice di rango 1. Usiamo questo per dare la definizione di rango per la mia matrice a dipartenza, ovvero diremo che il rango di A, quindi sia la mia matrice N per M, il rango di A che si scrive come RDA è il minimo che esiste, oschidiamo esisto, R vettori di dimensione M e W1 WR ovvero R vettori di lunghezza N tale che alla scrivo con il prodotto tensoriale tra W1 e W1 più il prodotto tensoriale tra W2 e W2 fino WR prodotto tensoriale WR ovvero R è il minimo intero per cui esistono R matrici di rango 1 come abbiamo definito prima, la cui insomma mi dà esattamente A. Questa scrittura si chiama la decomposizione di A e questa ci dà anche un altro idea allora ritorniamo un attimo soprattutto il prodotto tensoriale ci dà un altro idea che abbiamo visto che se io prendo un vettore molti più tensorialmente per un altro ottengo una matrice. Che cosa succede se io anziché fare W prodotto tensoriale W faccio anche il prodotto tensoriale un terzo vettore U? Beh, lo aggiungo diciamo in una terza dimensione e quello che otterrò è un cubietto. Potrei andare avanti il vettore S chiaramente vado in quattro dimensioni e nella lavagna non posso più disegnare. Questa è l'idea dei tensori. Cosa sono i tensori? Sono la generalizzazione delle matrici perché sono delle matrici multidimensionale. Quindi se io nella mia matrice le qui entrate ne indicavo con A e G, una matrice M per N quindi vuol dire che I andava tra 1 ed M e G andava tra 1 e N. Allora definiamo il tensore. Diremo il tensore T a dimensione N e tipo a 1. Cosa è fatto? È una matrice multidimensionale o se vogliamo un array multidimensionale in cui i vari indici saranno indicati, le varie entrate del mio tensore saranno indicati questa volta da un multi-indice i 1 e N dove i 1 assumerà valori fra 1 e a 1, i 2 fra 1 e a 2 fino ai N fra N. Chiaramente se N uguale a 2, cioè la dimensione 2 riottengo esattamente una matrice. Se N uguale a 3 ottengo una matrice tridimensionale diciamo un cubietto. Per fare un paio di esempi, ad esempio è un tensore 2 per 2 per 2 perché ho solo 2 indici nella prima dimensione, 2 indici nella seconda dimensione e 2 indici nella terza. Di questo è 2 per 2 per 2. Se io vi aggiungo un ulteriore livello mi diventa un tensore 3 per 2 e ripeto, solamente quelli tridimensionali sono quelli che posso disemnare. Allora anche in questo caso posso dare la stessa definizione di rango perché se prendo un tensore, diciamo la dimensione, quindi dimensione N è tipo a 1 per a N, io posso sempre costruire un cosiddetto tensore di rango 1, ovvero un tensore che sarà dato da B, diciamolo B1 per il lunghezza 1, B2 sarà un vettore di lunghezza 2, BN sarà un vettore di lunghezza N. Quindi faccio la stessa cosa di prima prematrice, solo il prematrice mi fermava il secondo passo. Se la dimensione 3 allungherò un terzo passo e così via. Però è sempre pensare che ogni entrata del mio tensore è indata, quindi il mio multi-indice I1IN è indato dal prodotto di cosa, dall'I1 coordinata del primo, dalla I2 coordinata del secondo fino alla I1 coordinata di UN, dove questi I1IN varieranno in queste. Quindi è poi costruito come il primo, prendo il primo vettore, lo multiplico, lo considero su tutto il tensore, poi a seconda delle coordinate dove sono lo multiplico per gli altri. Quindi anche in questo caso posso dire che il mio tensore di dimensione N, tipo A1N, avrà rango R, se qui lo posso scrivere come scriviamo il I1 plus PR, dove questi sono tutti i tensori di rango I, ovvero i tensori che posso scrivere come il prodotto tensoriale di vari vettori. Quindi ognuno di questi avrà la forma V1, andiamoci il mio tensore di dimensione N, aggiungiamo un ulteriore indice per dire questo è l'1 fino all'ultimo R, che sarà VR1, tensore, tensore V. Ok, e quindi anche in questo caso il rango di un tensore è il minimo R per cui esiste una decomposizione del mio tensore di partenza in tensori, come insomma di tensori di rango U, cioè che si possono scrivere come il prodotto tensoriale di vettori. Bene, a questo punto torniamo, mettiamo in parallel matrici e tensori, quindi la mia matrice so che ha un determinato rango e il mio tensore ha un determinato rango, lasciamo pure lo stesso numero, tanto non ci interessa. So che si può scrivere come la somma di R matrici di rango I, o il mio tensore si scrive come la somma di R tensori di rango I. Alla supponiamo io voglio trovare però una sola matrice di rango I, o un solo tensore di rango I che sia simile alla mia matrice o il mio tensore, quindi quello che vale a fare è dire che A sarà simile, metto un uguale un po' storto, A in questo caso sarà un V per V doppio, diciamoci, diciamo così, lo stesso il mio tensore è T di rocchio uguale a un V1 per Vm. Niente il mio tensore non è un po' essero uguale per il mio tensore rango R, questo è rango I e lo stesso è la mia matrice. Cerco solo di trovare un VW doppio tale che la matrice di rango I che ottengo sia abbastanza simile a A, o i miei N vettori tale che il prodotto tensoriale, quindi il tensore di rango I che ottengo sia simile al tensore T che ottengo. Questa viene chiamata una approssimazione di rango I. Capite che posso andare avanti? Posso dire, riesco a trovare due coppie di vettori VW e V primo e V doppio primo, tale che la mia matrice assomiglia a questo, beh se riesco a farlo allora questa sarà un'approssimazione di rango II della mia matrice e lo stesso qui. Riesco a trovare un'altra ennopla di vettori tale che la SOM di questi due tensori di rango I è abbastanza simile al mio tensore T. Se riesco a trovarlo dirò che questa è una approssimazione di rango II del mio tensore T e ovviamente possa andare avanti, approssimazione di rango III e approssimazione di rango IV. Bene, vediamo come sfruttare questi concetti nello studio dei sistemi di raccomandazione. Quindi ho preparato un esempio abbastanza semplice quindi ho supposto di avere un database, otto film, Blood Diamond Control, Gran Torino, Million Dollar Bevy, Non è un Paese per Vechis, Insidio, Petroliere e Winterbond. Ok, supponiamo che un utente, ad esempio l'utente U2 valuta i seguenti film quindi ha valutato Gran Torino con tre stelle, ha valutato Million Dollar Bevy con tre stelle, Insidio con cinque e Petroliere con quattro ed è quello che viene scritto nella mia in questo vettore delle valutazioni dove vedete ci sono dei punti interrogativi che sono chiaramente i film che questo utente non ha valutato. Supponiamo di avere più utenti, in questo caso facciamo un caso molto semplice, solo quattro utenti, voi capite che i siti di vendita online hanno migliori gli utenti. Mi supponiamo di avere uno, due o tre o un quattro. La matrice sotto R è la matrice in cui le righe rappresentano gli utenti mentre invece le colonne rappresentano gli otto film. Vedete ci sono utenti che hanno votato, che hanno votato, dato un rating a dei film diversi ad esempio l'utente U3 e l'utento 4 hanno dato un rating voto al film Control ci sono dei film come Blood Diamond che non sono stati valutati da nessun utente. Quello che dobbiamo fare per ottenere una raccomandazione e decidere quali di quegli otto film o meglio quali dei film che ogni utente ancora non ha selezionato, non ha valutato sia un film da consigliare perché noi ci aspettiamo che se un utente ha valutato quattro film l'ha visti e che magari gli altri non li ha visti. Quindi vogliamo scegliere tra gli altri quattro qual'è o cinque o se uno dà dei casi o tre o se uno dà dei casi qual'è il film da consigliare all'utente. Quindi dobbiamo trovare dei valori da ammettere al posto di questi numeri interrogativi. Allora la prima cosa che possiamo fare è prendere la media fra tutti gli utenti sugli otto film. Quindi guardo come sono stati valutati da tutti gli utenti. Questi otto film ottengono una media che è il vettore boot e le slide. Questa è una media che mi darà una predizione non personalizzata perché non tiene conto dei gusti dei miei singoli utenti 1, 2, 3 o 4. Quindi se vedete la mia matrice R che ripeto quello che voglio fare ora è un completamento di matrice quindi mettere dei valori su quella matrice. Se utilizzo la media personalizzata vuol dire che per ognuno della media non personalizzata e per ognuno degli utenti vada a mettere gli stessi valori. Cioè completo la mia matrice in questo modo. Come vedete tutte le righe sono diventate uguali. Chiaramente questa non è la mia matrice di rating su miei quattro utenti. È un'approssimazione ma se tutte le matrici sono diventate uguali, le righe sono diventate uguali rispetto allo stesso vettore, beh questo per quello che abbiamo detto prima non è altro che il prodotto tensoriale tra il vettore 1, 1, 1, 1 e il vettore V che è quello della media su tutti gli utenti. Quindi ho trovato che cosa questa è una approssimazione in rango 1 della matrice che voglio cercare. Se io raccalcolo con dei metodi matematici, ovvero con la norma, la differenza tra la mia matrice R che quella voglio studiare e questa matrice 1, un prodotto tensoriale V, ottengo una stima dell'errore leativo che in questo caso è del circa del 23,4%. Vediamo come si può migliorare la predizione quindi utilizzare qualcosa che tiene conto dei gusti degli utenti. Allora la prima cosa è che ogni film è descritto da vari caratteristiche quindi ci sono contenuti di azione, di dramma, di humor, di suspense quindi ad esempio posso valutare queste quantità con una valutazione a 5 stelle. Ad esempio, il bill avrà 5 stelle per quanto riguarda l'azione, 2 per la dramaticità e 0 per quanto riguarda l'amore. Di contro c'è poca azione in goste quindi li metto una stella e li metterò invece 5 stelle per quanto riguarda la dramaticità e l'amore. Allora supponiamo ad esempio che i contenuti di azione dei nostri film siano quelli descritti nella slide con quelle stelle quindi 0 stelle per control o per Winter Bones che non ci sono azioni, c'è molte azioni insin siti, c'è il giusto di azione in non è un paese per vecchi, c'è poca azione in grantorino e miglior dollar baby. Beh questi contenuti di azione per gli 8 film sono dei valori, sono veramente 3, 0, 1, 1, 2, 4, 1, 0 e quindi le posso mettere in un vettore e questo sarà il punteggio di azione del mio film, l'action score dei miei 8 film. Similmente posso aggiungere un drama score per indicare quant'è la dramaticità di ogni uno dei miei 8 film e posso aggiungere molte altri feature vectors quindi appunto l'amore, l'essere comico, l'essere horror però noi ci soffermiamo solo su questi due. Ad esempio assumiamo quindi che l'apprezzamento di un film da parte di un utente sia determinato sia dalla valutazione media che abbiamo visto all'inizio ma in più anche da un contributo di azione da un contributo di drama. Alla la nostra matrice era 4 utenti e 8 film quindi ogni entrata della matrice ha come coordinate utente film. Quindi nella slide potete vedere che quello che voglio trovare che il punteggio utente film sarà dato da cosa, da il valore del film sulla valutazione quella media non personalizzata. Poi ci sarà il punteggio a del film quindi sui contenuti d'azione più un alfa dell'utente, questo alfa dell'utente mi dai gradimento dell'utente su quanto vuole, piacciono l'azione nel film, più ci sarà un contributo e un gradimento utente per quanto riguarda i contenuti dramatici moltiplicato per la quantità di drama che c'è nel film. Quindi ora questa somma di questi tre elementi mi andrà a dare esattamente cosa devo mettere nell'entrata della matrice dove c'era il punto interrogativo per quello utente e quel film. Chiaramente questo mi cambierà perché poi lo faccio per tutti i film e mi cambierà anche i punteggi che vado ad dato e voglio sperare che in questo caso i punteggi che ottengo con questo sistema siano molto più vicini rispetto alla media personalizzata di prima ha i punteggi che ha già dato per determinati film il mio utente perché alla vuol dire che la mia valutazione sta funzionando bene. Ovviamente i gradimenti alfa e delta dell'utente sono delle incognite che io non so a ogni utente quanto li piacciono in film d'azione o quanto li piacciono in film dramatici però io posso ottenerli utilizzando i rating conosciuti perché io so che il mio utente ad esempio 2 ha valutato 3 grandorino ha valutato 3 mili dollar baby ha valutato 5 sinciti quindi sapendo quanti sono gli action score di questi film sapendo quanti sono il drama score di questi film io ho quell'equazione apposto tramite approssimazione e ricavare un valore atteso del gradimento dell'azione per il mio utente o 2 è un gradimento del drama per il mio utente o 2 come si vede alle slide viene fuori che all'utente o 2 piace l'azione ma piace poco piacciono poco i film dramatici questo è anche il motivo per cui molti siti di acquisto dopo che avete acquistato vi consiglio di fare una valutazione sul vostro acquisto perché in questo modo loro hanno dei parametri che li permettono di valutare ancora di più cosa consigliarvi in vendita bene ovviamente questo procedimento di trovare l'alpha e il delta lo devo fare non solo per u2 ma perturge 4 mili utenti lo faccio è lo stesso identico procedimento quindi una volta che ho determinato questo è il caso di u2 una volta ho determinato il suo alfa e il suo delta io so già il vettore degli action score per i film del drama score per i film so quant'è il vettore della valutazione media quindi tornando indietro io so a questo punto tutto quello che c'è qui come valori numerici in questa formula e quindi ottengo la riga delle predizioni dei punteggi per gli 8 film per il utente o 2 allora questa riga sotto sono i valori che erano stati dati forniti da 2 l'ultima riga rappresenta la predizione basata sulla media alla vedete nella predizione basata sulla media ad esempio l'utente aveva dato 3 per miglior dollar baby e 3 pegrantorino la predizione basata sulla media li assegnava un valore di 4.2 di 3.9 invece con questo nuovo sistema abbiamo trovato 3.8 e 3.5 quindi un valore che è più vicino al valore che aveva fornito 2 l'utente 2 allora lo stesso lo facciamo per tutti gli altri che cosa viene alla fine beh per come è stata scritta all'inizio la nostra formula altro non viene che la mia matrice di retting che trova in questo modo è il solito vettore la solita approssimazione di rango 1 che avevamo visto all'inizio nella prima parte 1 per v perché era sulla media non personalizzata poi però avevamo il mio vettore degli action che chiaramente moltiplicò per il mio vettore del contributo del gradimento dell'azione dei 4 utenti e lo stesso per il drama quindi alla fine la scrivo come somma di tre matrici di rango 1 ovvero questa diventerà una approssimazione di rango 3 della mia matrice facciamolo per tutte e 4 se uno fa i conti per tutte e 4 gli utenti alla fine la matrice che ottiene come con questa approssimazione rango 3 è questa qua e quindi a questo punto voi possiamo dire quali sono le miglior raccomandazioni da fare a vari utenti ad esempio per uno consiglieremo blod e anche per 2 e per 3 consiglieremo blod diamond perché quelli sono i valori più alti fra diciamo quelli blu per un 4 invece consigliamo gran torino perché il valore più alto ok possiamo migliorare questa stima perché osserviamo in assiduto che già l'errore sceso al 15.5% facendo il conto fra la matrice che ottengo la mia matrice di partenza e questa approssimazione rango 3 ma vediamo di migliorarla posso sfruttare i tensori per dare un'idea di decadimento temporale perché perché la valutazione media che viene fatta per il film ha senso principalmente nell'anno di uscita del film dopo 10 anni che è uscito magari il film piace meno quindi noi assumiamo che il rating medio è accurato solamente nel periodo di uscita del film e più il film in vecchia anno dopo anno perde la percentuale pari all'1% ogni anno cosa vuol dire questo se un film è vecchio di 5 anni supponiamo vfilm sia la sua valutazione media fra tutti gli utenti dopo 5 anni non lo valuto più vfilm come punteggio dove vfilm è il solito rating ma lo valuto vfilm per 0,95 cioè ho calato del 5% assumiamo anche per semplificarci la vita che tutti gli altri contributi cioè l'azione e il drama non dipendano dall'alietà del film anche se si sa che costumi gusti anche in funzione quello della televisione ci fa vedere in orari che prima non protetti poi non più cambia però assuniamo che siano tutti indipendenti dal tempo allora ora io non devo più scrivere una matrice ma devo scrivere un tensore in cui la mia entrata sarà data da la R da 13 utente valutazione quindi per l'utente per il film e per l'età cioè per l'età si intende l'età del film quindi la mia scrittura è come quella di prima però ora la prima parte quella dove c'era la valutazione media non personalizzata devo moltiplicare per l'età quanto è l'età assumiamo un tempo di 100 anni quindi sto moltiplicando sto utilizzando un vettore t che parte da 1 arriva fino a 0 quello che vedete nel slide 1 0,99 0,98 poi la seconda parte e la terza parte continua a essere la stessa cioè continua a moltiplicare per un vettore fatti di tutti i uni quindi fondamentalmente ora sto facendo questo un tensore di dimensione 3 in cui ci sono la somma di tre tensori di rango 1 il primo è il dato da tanti i uni per il vettore della valutazione media dei film per il vettore dei tempi il secondo invece la seconda parte la seconda somma c'è il vettore degli alpha moltiplicato tensorealmente per il vettore dei punti di azione del film moltiplicato per un vettore di lunghezza 100 con tutti i uni perché abbiamo detto che è costante il gusto il gradimento dell'azione i punti di azione per i 100 anni che sto considerando e contengo lo stesso discorso per il delta per il drama quindi a questo punto ottenuto un tensore che è una prossima decomposizione tensoriale di rango 3 e se valuto quello che ottenuto questo modello più avanzato per le previsioni di retting a questo punto lo devo valutare in funzione dell'anno e quindi prendo una fetta ottengo un errore del nativo che è sceso di circa 1 per cento bene prima di finire questo conclude diciamo l'esempio di come si possono usare le matrici e i tensori per fare sistemi di raccomandazione ovviamente sistemi più grossi richiedono modelli anche dai costi computazioni molto più elevati ma voglio far vedere un'altra applicazione dei tensori ora se io cerco ad esempio la parola firenze su google image all'inizio quando clicco sul thumbnail posso vedere l'immagine ma quando poi l'apro all'inizio mi appare un'immagine che è un'immagine compressa e solo dopo un po io vedrò l'immagine ad alta definizione allora che cos'è una foto per quanto riguarda il concluto ricordiamoci con i pizza della foto viene stabilito in funzione del suo indice di blu di rosso e di verde e non solo se vogliamo c'è anche un'altra un altro fattore che è il fattore alfa che mi dava fondamentalmente l'opacità quindi la mia foto in realtà che supponiamo abbia una misura di mille per due mila in realtà la posso pensare come un tensore di tipo mille per due mila per quattro ovvero un tensore tridimensionale cosa c'è nella prima faccia ci sarà il valore alfa di ogni pixel della mia foto nella seconda fetta del mio tensore ci sarà il valore di rosso del mio di ogni singolo pixel quella successiva il verde e poi l'ultima il blu quindi ogni foto io la posso pensare come un tensore ma se la posso pensare con un tensore per comprimerla che cosa faccio beh questo sarà un tensore da un rango enorme posso cercare di trovare una approssimazione tensoriale a un rango più basso chiaramente perderò alcuni dati però terrore un'immagine compressa perché mi porto dietro meno dati allora vi faccio vedere un'immagine quando faccio una compressione spinta utilizzando un'approssimazione tensoriale in questo caso ho approssimato molto perché ha approssimato la mia foto a rango 1 cioè il tensore associato a questa foto è stato scritto come la somma di un unico tensore di rango 1 cioè è uguale la approssimato con un tensore rango 1 cioè dato dal prodotto tensoriale dei miei vettori rango 5 quindi in questo caso è approssimato come somma di 5 tensori di rango 1 rango 10 già si comincia a distinguere qualcosa rango 15 rango 20 25 rango 50 75 100 150 200 e infine 300 quindi vedete un tensore che ha dimensione 4 e è stato approssimato con rango 300 questo vuol dire comunque il rango di un tensore supera la sua dimensione perché questo tensore associato alla mia figura a dimensione 4 a dimensione 3 perché è dato da l'altezza e larghezza della mia foto più la terza dimensione mi dà i diversi livelli di rosso verde blu e quantità alfa. Vi ringrazio per l'ascolto.