Come confrontare due oggetti per la percentuale di equivalenza

1

Sto provando a creare un'applicazione nodoJS. Permette agli utenti di valutare un gruppo di canzoni e li memorizza nei loro profili utente. Uso queste informazioni per confrontarle con altri utenti e cerco di trovare utenti con interessi simili nelle canzoni e suggerisco loro nuovi brani basati su questo.

Ogni profilo utente assomiglia a questo

userID: [the userid of the user]
songs: [the list of songs that the user has rated]
ratings: [the corresponding ratings each user gave to the song]

Ogni canzone è rappresentato da un numero intero a 9 cifre e ogni valutazione è un numero intero da 1 a 6 . Fondamentalmente, devo confrontare un utente con il resto degli utenti per determinare quali di essi corrispondono meglio a questo utente. Per corrispondenza, intendo dire le stesse canzoni con valutazioni simili. Per fare questo, ho creato un semplice algoritmo.

Step 1) Create a list, in which each entry maps our target user to each of the other 
        users. 
Step 2) Now consider each entry, determine which songs both of the users have rated, and 
        store those songs (along with the corresponding ratings each user gave them) in 
        this entry itself 
Step 3) Now iterate through each entry and perform the following operations 

        a) let percentage = 0
        b) let num = [the number of songs that both users rated]
        c) iterate through each song (that both the users rated) and perform the
           following operations

                i)    determine the score our target user gave this song and store it in 
                      variable a
                ii)   determing the score the other user gave this song and store it in 
                      variable b
                iii)  map a and b to new values based on this 
                        1 --> -3
                        2 --> -2
                        3 --> -1
                        4 -->  1
                        5 -->  2
                        6 -->  3
                iv)   now calculate sum as 
                    sum = |a| + |b|
                    where || is the absolute values
                v)    now calculate degree as 
                    degree = sum/2
                vi)   now if a * b is less than 0 then
                            calculate (percentage - degree) and store that value
                            again in percentage
                          if not then 
                            calculate (percentage - degree) and store that value 
                            again in percentage

        d) now  calculate (50 + (percentage / (6*num))*100) and store that value 
           in this entry as match

Step 4) Now that I have my list of entries (along with the match between each pair 
        of target user and other user) I sort the list in descending order of match 
        and from that, I can determine which users have the closest match in taste by 
        selecting from the first entries

Ora per ogni coppia di utenti, sto completamente trascurando le canzoni che un utente ha valutato e l'altra no, e va bene per me.

Tuttavia ci sono diversi problemi con questo metodo, il più importante è che questo algoritmo richiede molto tempo a un vasto gruppo di utenti (ad esempio circa 1.000.000). E anche che devo caricare tutti gli utenti, ogni volta che ho bisogno di trovare un insieme di utenti corrispondenti per solo 1 utente. E ho bisogno di farlo ripetutamente per quell'utente, per aggiornare la sua lista.

C'è un modo per renderlo più efficiente? Posso assegnare un valore a ciascun utente che tenga conto di tutti i brani che hanno valutato e utilizzare quel numero per confrontare gli utenti? È possibile? Immagino che cosa sto chiedendo è, come posso confrontare e confrontare questi dati, matematicamente, per trovare utenti simili, in modo efficiente. Inoltre, qualcuno può suggerire un tag appropriato per questo tipo di domanda?

    
posta Rockstar5645 27.06.2016 - 16:05
fonte

1 risposta

0

wigy ha pubblicato un link ad alcune cose che sono molto rilevanti ma penso che ci siano alcune cose semplici che possono aiutare qui. Offro alcuni suggerimenti che probabilmente non sono ottimali, ma potrebbero aiutarti ad andare avanti.

La prima cosa che suggerirei è di evitare di scorrere su ogni altro utente per un utente. Vorrei invece scorrere tra le canzoni che l'utente ha valutato e quindi caricare tutti gli utenti che hanno anche valutato quella canzone (potrebbe essere problematico per le canzoni molto popolari, ma torniamo a quello.) Contare quante volte ogni utente esce. Ad esempio, se un utente ha valutato 6 canzoni che l'utente target ha valutato, ottengono un 6.

Quindi eliminerei tutti gli utenti che si trovano al di sotto di una soglia (probabilmente dovrai provare cose diverse). Inizia con 10 forse. Il motivo è che, statisticamente, non significa quasi nulla se due utenti hanno entrambi valutato una canzone. Più brani hanno entrambi votati, maggiore è la sicurezza che dovresti avere nei tuoi calcoli. Questo dovrebbe anche aiutare con il problema delle canzoni "hit". Ci sono alcune canzoni che molte persone hanno sentito non molte che tutti hanno sentito.

Un'altra cosa che puoi fare è che dopo aver valutato due utenti, salva la risposta. Non hai davvero spiegato come stai memorizzando i tuoi dati e molto di come risolvi questo problema riguarderà l'archiviazione persistente (o di lungo periodo) dei tuoi dati e risultati.

    
risposta data 27.06.2016 - 17:42
fonte

Leggi altre domande sui tag