2013-05-04 9 views
20

Sono perplesso su ciò che la raccomandazione item-based è in "mahout in azione" .C'è l'algoritmo nel libro:Qual è la differenza tra il filtraggio collaborativo raccomandazione Item-based e raccomandazioni basato sul contenuto

for every item i that u has no preference for yet 
    for every item j that u has a preference for 
    compute a similarity s between i and j 
    add u's preference for j, weighted by s, to a running average 
return the top items, ranked by weighted average 

cosa posso calcolare la somiglianza tra gli articoli? Se si utilizza il contenuto, non è una raccomandazione basata sul contenuto?

risposta

91

Articolo basato filtraggio collaborativo

La raccomandazione originale dell'oggetto-based è totalmente in base al ranking utente-oggetto (ad esempio, un utente nominale un film con 3 stelle, o un utente "piace" un video) . Quando calcoli la somiglianza tra gli elementi, non devi conoscere altro che la cronologia degli utenti di tutti gli utenti. Quindi la somiglianza tra gli elementi è calcolata in base alle valutazioni invece dei metadati del contenuto dell'articolo.

Lasciatemi fare un esempio. Supponiamo di avere accesso solo ad alcuni dati di rating come di seguito:

user 1 likes: movie, cooking 
user 2 likes: movie, biking, hiking 
user 3 likes: biking, cooking 
user 4 likes: hiking 

Supponiamo ora si vuole fare raccomandazioni per l'utente 4.

Prima si crea un indice invertito per gli oggetti, si otterrà:

movie:  user 1, user 2 
cooking: user 1, user 3 
biking: user 2, user 3 
hiking: user 2, user 4 

Poiché si tratta di una valutazione binaria (simile o meno), è possibile utilizzare una misura di somiglianza come Jaccard Similarity per calcolare la somiglianza degli articoli.

        |user1| 
similarity(movie, cooking) = --------------- = 1/3 
           |user1,2,3| 

Nel numeratore, utente1 è l'unico elemento che il film e la cottura hanno entrambi. Nel denominatore l'unione di film e cucina ha 3 utenti distinti (utente 1,2,3). |.| qui indicano la dimensione del set. Quindi sappiamo che la somiglianza tra film e cucina è 1/3 nel nostro caso. Fai semplicemente la stessa cosa per tutte le possibili coppie di articoli (i,j).

Dopo aver finito con il calcolo similitudine per tutte le coppie, per esempio, è necessario fare una raccomandazione per l'utente 4.

  • sguardo al punteggio di somiglianza di similarity(hiking, x) dove x è un qualsiasi altro tag che potrebbero avere .

Se è necessario fornire un suggerimento per l'utente 3, è possibile aggregare il punteggio di somiglianza tra ciascuna voce del proprio elenco. Ad esempio,

score(movie) = Similarity(biking, movie) + Similarity(cooking, movie) 
score(hiking) = Similarity(biking, hiking) + Similarity(cooking, hiking) 

basa-content content-based raccomandazione

Il punto è che dobbiamo conoscere il contenuto di entrambi utente e voce. Generalmente si costruiscono profilo utente e profilo oggetto utilizzando il contenuto dello spazio attributo condiviso. Ad esempio, per un film, lo si rappresenta con le stelle del film in esso e i generi (utilizzando una codifica binaria per esempio). Per il profilo utente, puoi fare la stessa cosa in base agli utenti, ad esempio alcune stelle/generi cinematografici, ecc. Quindi la somiglianza tra utente e oggetto può essere calcolata usando, ad esempio, somiglianza del coseno.

Ecco un esempio concreto:

Supponiamo che questo è il nostro profilo utente (utilizzando la codifica binaria, 0 significa non-like, 1 mezzi simili), che contiene la preferenza dell'utente più di 5 stelle del cinema e 5 generi cinematografici:

  Movie stars 0 - 4 Movie Genres 
user 1: 0 0 0 1 1   1 1 1 0 0 
user 2: 1 1 0 0 0   0 0 0 1 1 
user 3: 0 0 0 1 1   1 1 1 1 0 

Suppongo che questo sia il nostro film-profilo:

  Movie stars 0 - 4 Movie Genres 
movie1: 0 0 0 0 1   1 1 0 0 0 
movie2: 1 1 1 0 0   0 0 1 0 1 
movie3: 0 0 1 0 1   1 0 1 0 1 

per calcolare quanto è buono un film è quello di un utente, usiamo cosine similarity:

        dot-product(user1, movie1) 
similarity(user 1, movie1) = --------------------------------- 
            ||user1|| x ||movie1|| 

           0x0+0x0+0x0+1x0+1x1+1x1+1x1+1x0+0x0+0x0 
          = ----------------------------------------- 
             sqrt(5) x sqrt(3) 

          = 3/(sqrt(5) x sqrt(3)) = 0.77460 

Allo stesso modo:

similarity(user 2, movie2) = 3/(sqrt(4) x sqrt(5)) = 0.67082 
similarity(user 3, movie3) = 3/(sqrt(6) x sqrt(5)) = 0.54772 

Se si vuole dare una raccomandazione per l'utente i, basta scegliere film j che ha il più alto similarity(i, j).

Spero che questo aiuti.

+1

grazie per il tuo post, ed è così dettagliato. – cstur4

+0

Cooking ha 2 utenti distinti? –

4

"Basato su oggetti" significa in realtà "oggetto-basato sulla similarità". Puoi inserire qualsiasi metrica di similarità che ti piace qui. Sì, se è basato sul contenuto, come una similarità del coseno rispetto ai vettori del termine, puoi anche chiamare questo "basato sul contenuto".

+1

Grande onore ricevere la tua risposta.E Al fine di confrontare l'effetto di due metodi di raccomandazione, utilizzo RMSRecommenderEvaluator per valutare. Anche se con lo stesso parametro, ma non può garantire gli stessi dati di allenamento e valutare i dati. posso fare per confrontarli con gli stessi dati? – cstur4

+0

Vuoi dire perché il set di allenamento casuale è diverso? Prova a chiamare 'RandomUtils.useTestSeed()' prima che venga eseguito qualsiasi altro. –

+0

Ma voglio eseguire diversi test case e voglio che il risultato sia diverso. – cstur4