PDA

Visualizza la versione completa : [ALGORITMO] Calcolare il gradimento di una canzone


vortex87
25-12-2005, 21:57
Avendo a disposizione il numero di volte in cui una canzone è stata ascoltata fino alla fine (chiamiamolo "play") ed il numero di volte che la si è interrotta ("skip"), mi trovo a dover modificare il valore di gradimento della canzone stessa, costituito da un indice tra 0 e 1, di cui il valore iniziale (neutro) è 0.5

Ora, ogni volta che una canzone termina (perchè finita o skippata) devo alzare o abbassare il rating: in che modo posso ottenere il valore da aggiungere/togliere?

Grazie :stordita:

Andrea1979
25-12-2005, 22:18
Dovresti aggiungere alcune ipotesi, tipo:

E' influente l'istante eventuale dello "skipping"? Mi spiego, se skippi dopo 2 secondi (la canzone ti fa schifo totale), oppure skippi a due secondi dalla fine (la canzone ti piace me devi andare al bagno, fuori con la ragazza/il ragazzo o simili) è la stessa cosa?

ibykos
25-12-2005, 23:35
Sembrerà banale, però lo scrivo lo stesso

gradimento = (play-skip)/play

oppure (questa è una inutile complicazione)

DeltaGradimento = 1-skip/play- VecchioGradimento

vortex87
26-12-2005, 12:32
Originariamente inviato da ibykos
Sembrerà banale, però lo scrivo lo stesso

gradimento = (play-skip)/play

oppure (questa è una inutile complicazione)

DeltaGradimento = 1-skip/play- VecchioGradimento

Così però c'è l'eventualità di una divisione per 0 o di un numero negativo, mentre a me serve tra 0 e 1

Inoltre ho dimenticato di specificare una cosa, l'auto-rating deve influire su un valore che può anche essere impostato dall'utente, quindi non posso ricalcolarlo tutte le volte

Per quanto riguarda il tempo di skip invece temo di non poterlo intercettare :stordita:

ibykos
26-12-2005, 17:00
Se usi solo la prima formula [gradimento = (play - skip / play)]
ti basta imporre condizione che play non sia 0.



if ( play != 0)
gradimento = (play - skip ) /play ;
else
gradimento = 0.5;



play - skip è una quantità sempre positiva (puoi chiudere una canzone un nuemro di volte pari al massimo al numero di ovlte che l'hai aperta) compresa tra 0 (sempre chiusa prima del termine) e play (mai chiusa prima del termine), da cui risulta che la quantità gradimento = (play - skip) /play è una quantità strettamente compresa tra 0 e 1.

vortex87
26-12-2005, 21:45
Play in realtà sarebbe solo il numero di volte in cui è terminata, ma per questo non c'è problema.

C'è un problema invece nel caso di una canzone sempre skippata, perchè il gradimento deve sempre essere diminuito e mai reimpostato di netto.

play / (play + skip) può funzionare come formula generica? Resta poi da calcolare la variazione da applicare, appunto perchè devo tenere conto anche del valore impostato dall'utente

FelixR
26-12-2005, 22:30
non c'è nessun modo per calcolare il tasso di aumento, perchè per restare sotto l'uno dovresti sapere e priori quante volte verrà suonata la canzone e "normalizzare" rispetto a quel valore.
Puoi però ricalcolarlo ogni volta che una canzone viene suonata o skippata.
Supponiamo che 0.6 sia rating iniziale dell'utente(0.5 se non lo definisce). In play abbiamo il numero di volte ascoltata e in skip il numero di volta che l'ha stoppata. Possiamo fare una specie di sistema a votazioni e ad ogni aggiornamento fare una media; mi spiego meglio:
Il primo voto sarà 0.6; se l'utente skippa la canzone il voto è zero, se la finisce il voto è uno. In tutto il numero di voti saranno play+skip+1. Per ricalcolare il nuovo rating dopo uno skip o un play basta fare:

(rating_iniziale+play)/(play+skip+1)

questo valore sarà sempre tra 0 e 1.

Questo sistema, comunque, di inizializzare il rating a 0.5 non mi piace affatto, perchè se lui non l'ha mai ascoltata non vuol dire che gli piace a metà, ma che non gli piace. Secondo me dovresti fare che il rating_iniziale è 0 e se lui vuole la inizializza a 1(oppure potresti anche fare che la inizializzi dopo il primo ascolto, 0 se skippa 1 se la completa). Questo è anche più logico dal punto di vista matematico perchè se la skippa sempre, utilizzando la formula di sopra, nel secondo caso il rating finale sarà 0 mentre nel caso precedente sarà sempre positivo. Stessa cosa, se gli piace la inizializza a 1 e se la sente sempre tutta il rating finale resterà a 1.

Se non è questo l'effetto che vuoi ottenere, e cioè che anche se la skippa sempre vuoi che il voto si abbassi gradualmente, usa il primo sistema.

Ciao

unomichisiada
27-12-2005, 02:28
Originariamente inviato da FelixR
non c'è nessun modo per calcolare il tasso di aumento, perchè per restare sotto l'uno dovresti sapere e priori quante volte verrà suonata la canzone e "normalizzare" rispetto a quel valore.
Puoi però ricalcolarlo ogni volta che una canzone viene suonata o skippata.
Supponiamo che 0.6 sia rating iniziale dell'utente(0.5 se non lo definisce). In play abbiamo il numero di volte ascoltata e in skip il numero di volta che l'ha stoppata. Possiamo fare una specie di sistema a votazioni e ad ogni aggiornamento fare una media; mi spiego meglio:
Il primo voto sarà 0.6; se l'utente skippa la canzone il voto è zero, se la finisce il voto è uno. In tutto il numero di voti saranno play+skip+1. Per ricalcolare il nuovo rating dopo uno skip o un play basta fare:

(rating_iniziale+play)/(play+skip+1)

questo valore sarà sempre tra 0 e 1.

Questo sistema, comunque, di inizializzare il rating a 0.5 non mi piace affatto, perchè se lui non l'ha mai ascoltata non vuol dire che gli piace a metà, ma che non gli piace. Secondo me dovresti fare che il rating_iniziale è 0 e se lui vuole la inizializza a 1(oppure potresti anche fare che la inizializzi dopo il primo ascolto, 0 se skippa 1 se la completa). Questo è anche più logico dal punto di vista matematico perchè se la skippa sempre, utilizzando la formula di sopra, nel secondo caso il rating finale sarà 0 mentre nel caso precedente sarà sempre positivo. Stessa cosa, se gli piace la inizializza a 1 e se la sente sempre tutta il rating finale resterà a 1.

Se non è questo l'effetto che vuoi ottenere, e cioè che anche se la skippa sempre vuoi che il voto si abbassi gradualmente, usa il primo sistema.

Ciao
Concordo!

vortex87
27-12-2005, 10:34
Originariamente inviato da FelixR
non c'è nessun modo per calcolare il tasso di aumento, perchè per restare sotto l'uno dovresti sapere e priori quante volte verrà suonata la canzone e "normalizzare" rispetto a quel valore.
Puoi però ricalcolarlo ogni volta che una canzone viene suonata o skippata.
Supponiamo che 0.6 sia rating iniziale dell'utente(0.5 se non lo definisce). In play abbiamo il numero di volte ascoltata e in skip il numero di volta che l'ha stoppata. Possiamo fare una specie di sistema a votazioni e ad ogni aggiornamento fare una media; mi spiego meglio:
Il primo voto sarà 0.6; se l'utente skippa la canzone il voto è zero, se la finisce il voto è uno. In tutto il numero di voti saranno play+skip+1. Per ricalcolare il nuovo rating dopo uno skip o un play basta fare:

(rating_iniziale+play)/(play+skip+1)

questo valore sarà sempre tra 0 e 1.

Questo sistema, comunque, di inizializzare il rating a 0.5 non mi piace affatto, perchè se lui non l'ha mai ascoltata non vuol dire che gli piace a metà, ma che non gli piace. Secondo me dovresti fare che il rating_iniziale è 0 e se lui vuole la inizializza a 1(oppure potresti anche fare che la inizializzi dopo il primo ascolto, 0 se skippa 1 se la completa). Questo è anche più logico dal punto di vista matematico perchè se la skippa sempre, utilizzando la formula di sopra, nel secondo caso il rating finale sarà 0 mentre nel caso precedente sarà sempre positivo. Stessa cosa, se gli piace la inizializza a 1 e se la sente sempre tutta il rating finale resterà a 1.

Se non è questo l'effetto che vuoi ottenere, e cioè che anche se la skippa sempre vuoi che il voto si abbassi gradualmente, usa il primo sistema.

Ciao

Grazie :D

Il fatto è che non posso agire sul rating iniziale perchè quello che sto sviluppando è soltanto un plugin esterno per quodlibet, che quando inserisce in libreria una canzone la mette automaticamente a 0.5. Il concetto è questo, secondo me: 0.5=neutro, >0.5 buono, <0.5 scarso

Andrea1979
27-12-2005, 12:23
Allora

(*) gradimento = 0.5 + 0.5*(play-skip)/(play+skip) se play+skip != 0
gradimento = 0.5, altrimenti.

(*) Ossia semplificato: gradimento = 0.5 * 2*play/(play+skip)

Dove con play intendo ascoltato per intero (e quindi, play+skip è il numero di volte in cui il file è stato aperto, indipendentemente dal fatto che l'ascolto sia giunto al termine o meno)

Loading