Sistemul recomandator - Factorizare matricială
Filtrare colaborativă: Filtrarea colaborativă este de a descoperi asemănări cu comportamentul trecut al utilizatorului și de a face predicții pentru utilizator pe baza unei preferințe similare cu alți utilizatori. Acest model este apoi utilizat pentru a prezice articole (sau evaluări pentru articole) în care utilizatorul poate avea un interes.
Filtrare bazată pe conținut : Filtrarea bazată pe conținut este utilizată pentru a produce recomandări de articole bazate pe caracteristicile articolelor.
În acest articol, veți afla algoritmul de factorizare matricială a sistemului recomandator:
(1) Introducere în factorizarea matricei
(2) Conceptul matematic al factorizării matricei
(3) Experiență practică a codului pyton privind factorizarea matricei
Introducere în Factorizarea matricială
Factorizarea matricială este o modalitate de a genera caracteristici latente atunci când înmulțiți două tipuri diferite de entități. Filtrarea colaborativă este aplicarea factorizării matricei pentru a identifica relația dintre entitățile și elementele utilizatorilor. Odată cu introducerea evaluărilor utilizatorilor asupra articolelor din magazin, am dori să prezicem cum utilizatorii ar evalua articolele astfel încât utilizatorii să poată primi recomandarea pe baza previziunilor.
Presupunem că avem tabelul de clasare al clienților format din 5 utilizatori și 5 filme, iar evaluările sunt numere întregi cuprinse între 1 și 5, matricea este oferită de tabelul de mai jos.
Întrucât nu fiecare utilizator acordă rating tuturor filmelor, există multe valori care lipsesc în matrice și rezultă o matrice redusă. Prin urmare, valorile nule care nu sunt date de utilizatori ar fi completate cu 0 astfel încât valorile completate să fie furnizate pentru înmulțire. De exemplu, doi utilizatori acordă ratinguri ridicate unei anumite mișcări atunci când filmul este interpretat de actorul și actrița lor preferată sau genul filmului este unul de acțiune, etc. Din tabelul de mai sus, putem găsi că user1 și user3 dau atât evaluări pentru filmul 2 și filmul 3. Prin urmare, din factorizarea matricei, suntem capabili să descoperim aceste caracteristici latente pentru a da o predicție asupra unei evaluări în ceea ce privește similitudinea preferințelor și interacțiunilor utilizatorului.
Având în vedere un scenariu, utilizatorul 4 nu a acordat o evaluare filmului 4. Am dori să știm dacă utilizatorul 4 ar dori filmul 4. Metoda este de a descoperi alți utilizatori cu preferințe similare ale utilizatorului 4, luând evaluările date de utilizatorii de preferințe similare cu filmul 4 și prevăd dacă utilizatorul 4 ar dori filmul 4 sau nu.
Conceptul matematic al factorizării matricei
Definiți un set de utilizatori (U), articole (D), dimensiunea R de | U | și | D |. Matricea | U | * | D | include toate evaluările date de utilizatori. Scopul este de a descoperi caracteristici latente K. Dat cu introducerea a două matrici matrice P (| U | * k) și Q (| D | * k), ar genera rezultatul produsului R.
Matricea P reprezintă asocierea dintre un utilizator și caracteristici în timp ce matricea Q reprezintă asocierea dintre un element și caracteristici. Putem obține predicția unei evaluări a unui articol prin calculul produsului punct al celor doi vectori corespunzători u_i și d_j.
Pentru a obține două entități deopotrivă P și Q, trebuie să inițializăm cele două matrici și să calculăm diferența produsului numit matricea M. În continuare, minimizăm diferența prin iterații. Metoda se numește descendență în gradient , având ca scop găsirea unui minim local al diferenței.
Pentru a minimiza eroarea, gradientul este capabil să minimizeze eroarea și prin urmare diferențiem ecuația de mai sus față de aceste două variabile separat.
Din gradient, formula matematică poate fi actualizată atât pentru p_ik cât și pentru q_kj. a este pasul pentru a atinge valoarea minimă în timp ce gradientul este calculat, iar a este de obicei setat cu o valoare mică.
Din ecuația de mai sus, p'_ik și q'_kj pot fi ambele actualizate prin iterații până când eroarea se transformă la minim.
Exemplu de factorizare a matricei
Produsul punct al utilizatorului și al matricei elementului poate genera matricea de evaluare, în timp ce matricea utilizatorului are forma lui k (utilizatori) * f (caracteristici), iar matricea elementului este forma j (elemente) * f (caracteristici). Din matricile utilizatorului și ale articolului, caracteristicile filmelor pot fi genul său, actorii, complotul etc. Cu două caracteristici ale matricelor date în calcul, să presupunem că F1 este „Dacă acest film este o comedie sau nu?” și F2 să fie „dacă Robin Williams acționează în film?”
User Matrix: Potrivit User1, dacă este un film de comedie, îi va da 4 puncte și dacă Robin Williams este actorul din film, îi va da încă 3 puncte.
Matricea elementului: Există în principal valori binare în matricea elementului unde valoarea este 1 atunci când îndeplinește condițiile de mai sus și 0 în caz contrar. Prin efectuarea produsului punct al matricei utilizatorului și al matricei elementelor, matricea de rating va fi generată.
Factorizarea matricei a utilizatorilor și a elementelor matriciale poate fi generată atunci când funcția de costuri matematice RMSE este minimizată prin factorizarea matricei. Urmând conceptul matematic de mai sus, descendența în gradient este una dintre metodele de minimizare a RMSE prin fiecare iterație.
Codul Python practic pentru factorizarea matricei
Mai jos este fragmentul de cod piton pentru a conduce algoritmul de coborâre a gradientului. Am stabilit o matrice de rating cu 4 filme oferite de 6 utilizatori. După cum puteți vedea, unii utilizatori nu au mai vizionat unele filme înainte, astfel încât evaluarea este dată ca 0 în rating.
import numpy def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02): ''' R: rating matrix P: |U| * K (User features matrix) Q: |D| * K (Item features matrix) K: latent features steps: iterations alpha: learning rate beta: regularization parameter''' Q = Q.T for step in range(steps): for i in range(len(R)): for j in range(len(R[i])): if R[i][j] > 0: # calculate error eij = R[i][j] - numpy.dot(P[i,:],Q[:,j]) for k in range(K): # calculate gradient with a and beta parameter P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k]) Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j]) eR = numpy.dot(P,Q) e = 0 for i in range(len(R)): for j in range(len(R[i])): if R[i][j] > 0: e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2) for k in range(K): e = e + (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2)) # 0.001: local minimum if e < 0.001: break return P, Q.T
R = [ [5,3,0,1], [4,0,0,1], [1,1,0,5], [1,0,0,4], [0,1,5,4], [2,1,3,0], ] R = numpy.array(R) # N: num of User N = len(R) # M: num of Movie M = len(R[0]) # Num of Features K = 3 P = numpy.random.rand(N,K) Q = numpy.random.rand(M,K)
Matricea prevăzută este generată mai jos. După cum puteți vedea, matricea prevăzută are o ieșire similară cu valorile adevărate, iar evaluările 0 sunt înlocuite cu predicția bazată pe preferințele utilizatorilor similare la filme.
Putem vedea că pentru evaluările existente avem aproximări foarte apropiate de valorile adevărate și obținem și unele „predicții” ale valorilor necunoscute. Cu caracteristica oferită ca trei, algoritmul este capabil să asocieze utilizatorii și elementele la trei caracteristici diferite, iar previziunile urmează și aceste asocieri. Putem constata că U2, U5 și U6 dau un rating scăzut pe M1 și M2 și dau un rating ridicat pe M3. Chiar dacă U5 nu a urmărit M1, am deduce în continuare că U5 ar putea să nu placă M1.
Pred_Matrix | M1 | M2 | M3 | M4 |
---|---|---|---|---|
U1 | 4.9921822 | 2.94665346 | 3.40536863 | 1.00099803 |
U2 | 3.97665318 | 2.15037496 | 3.10801712 | 0.99668824 |
U3 | 1.04690221 | 0.89961819 | 5.20187891 | 4.96401721 |
U4 | 0.98735764 | 0.77053916 | 4.27454201 | 3.97482436 |
U5 | 1.86869693 | 1.09103752 | 4.94375052 | 4.02158161 |
U6 | 1.93781997 | 1.06363722 | 3.01008954 | 1.99265014 |
În lumea reală, matricea de rating este foarte redusă, deoarece fiecare utilizator urmărește filme la frecvențe diferite. Cu toate acestea, funcția de eroare RMSE este calculată doar cu ratingul nul. Înregistrările lipsă din matricea de rating vor fi înlocuite cu produsul punct al matricilor factorilor. Prin urmare, știm ce să recomandăm utilizatorilor cu filme nevăzute bazate pe predicție.
In concluzie:
- Factorizarea matricială este o metodă de filtrare colaborativă pentru a găsi relația dintre elementele și entitățile utilizatorilor. Funcțiile latente, asocierea între utilizatori și matricile filmelor, sunt determinate să găsească similitudini și să facă o predicție bazată atât pe entitate cât și pe entități ale utilizatorului
- Factorizarea matricei a utilizatorilor și a elementelor matriciale poate fi generată atunci când funcția de costuri matematice RMSE este minimizată prin factorizarea matricei. Coborârea gradientului este o metodă de minimizare a funcției de cost.