Saltar al contenido

Algoritmo de popularidad simple

Luego de consultar con expertos en esta materia, programadores de diversas ramas y maestros dimos con la respuesta al problema y la dejamos plasmada en este post.

Solución:

Creo que este es un muy buen enfoque, dada su simplicidad. Un resultado muy interesante.

Hice un conjunto rápido de cálculos y descubrí que este algoritmo parece entender lo que significa “popularidad”. Su problema es que tiene una clara tendencia a favorecer votaciones recientes como esta:

Imagine que tomamos el tiempo y lo dividimos en valores de marca de tiempo discretos que van desde 100 a 1000. Suponga que en t = 100 tanto A como B (dos elementos) tienen el mismo P = 100.

    A gets voted 7 times on 200, 300, 400, 500, 600, 700 and 800
resulting on a final Pa(800) = 700 (aprox).

    B gets voted 4 times on 300, 500, 700 and 900 
resulting on a final Pb(900) = 712 (aprox).

Cuando llega t=1000, tanto A como B reciben votos, entonces:

Pa(1000) = 850 with 8 votes
Pb(1000) = 856 with 5 votes

¿Por qué? porque el algoritmo permite que un elemento con rapidez vencer a los líderes históricos si recibe votos más recientes (incluso si el elemento tiene menos votos en total).

EDITAR INCLUYENDO SIMULACIÓN

El OP creó un buen violín que cambié para obtener los siguientes resultados:

http://jsfiddle.net/wBV2c/6/

Item A receives one vote each day from 1970 till 2012 (15339 votes)
Item B receives one vote each month from Jan to Jul 2012 (7 votes)

The result: B is more popular than A.

El algoritmo propuesto es un buen enfoque y es un caso especial de una media móvil exponencial donde alfa = 0,5:

p = alpha*p + (1-alpha)*t = 0.5*p + 0.5*t = (p+t)/2    //(for alpha = 0.5)

Una forma de modificar el hecho de que la solución propuesta para alfa=0,5 tiende a favorecer las votaciones recientes (como señaló daniloquio) es elegir valores más altos para alfa (p. ej., 0,9 o 0,99). Tenga en cuenta que aplicar esto al caso de prueba propuesto por daniloquio es no sin embargo, funciona porque cuando alfa aumenta, el algoritmo necesita más ‘tiempo’ para establecerse (por lo que las matrices deben ser más largas, lo que a menudo es true en aplicaciones reales).

Por lo tanto:

  • para alpha=0.9 el algoritmo promedia aproximadamente los últimos 10 valores
  • para alpha=0.99 el algoritmo promedia aproximadamente los últimos 100 valores
  • para alpha=0.999 el algoritmo promedia aproximadamente los últimos 1000 valores
  • etc.

Veo un problema, solo cuentan los últimos ~24 votos.

p_i+1 = (p + t) / 2

Por dos votos tenemos

p2 = (p1 + t2) / 2 = ((p0 + t1) /2 + t2 ) / 2 = p0/4 + t1/4 + t2/2

Expandiendo eso por 32 votos da:

p32 = t*2^-32 + t0*2^-32 + t1*2^-31 + t2*2^-30 + ... + t31*2^-1

Entonces, para valores de 32 bits con signo, t0 no tiene efecto en el resultado. Como t0 se divide por 2^32, no contribuirá en nada a p32.

Si tenemos dos elementos A y B (no importa cuán grandes sean las diferencias), si ambos obtienen los mismos 32 votos, tendrán la misma popularidad. Así que su historia se remonta a sólo 32 votos. No hay diferencia en 2032 y 32 votos, si los últimos 32 votos son iguales.

Si la diferencia es menor a un día, serán iguales después de 17 votos.

Te mostramos las reseñas y valoraciones de los usuarios

Nos encantaría que puedieras dar visibilidad a este enunciado si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *