2012-01-06 10 views
22

Necesito proporcionar una ordenación ponderada de los factores 2+, ordenados por "relevancia". Sin embargo, los factores no están completamente aislados, ya que quiero que uno o más de los factores afecten a la "urgencia" (peso) de los demás.Cómo proporcionar los resultados más relevantes con clasificación ponderada de factores múltiples

Ejemplo: contenido contribuido (artículos) se puede votar hacia arriba o hacia abajo, y por lo tanto tiene una calificación; tienen una fecha de publicación y también están etiquetados con categorías. Los usuarios escriben los artículos y pueden votar, y pueden o no tener algún tipo de clasificación (experto, etc.). Probablemente similar a StackOverflow, ¿verdad?

Quiero proporcionar a cada usuario una lista de artículos agrupados por etiqueta, pero ordenadas según la "relevancia", donde relevancia se calcula basándose en la calificación y la edad del artículo, y posiblemente afectada por la clasificación del autor . ES DECIR. un artículo altamente calificado que se escribió hace varios años puede no ser necesariamente tan relevante como un artículo de rango medio escrito ayer. Y tal vez si un artículo fue escrito por un experto sería tratado como más relevante que uno escrito por "Joe Schmoe".

Otro buen ejemplo sería assigning hotels a "meta score" comprised of price, rating, and attractions.

Mi pregunta es, ¿cuál es el mejor algoritmo para la clasificación de factores múltiples? Esto puede ser un duplicado de that question, pero estoy interesado en un algoritmo genérico para cualquier cantidad de factores (una expectativa más razonable es de 2 a 4 factores), preferiblemente una función "totalmente automática" que no tengo que modificar o requiera la entrada del usuario, y no puedo analizar el álgebra lineal y la autocomplacencia del vector propio.


posibilidades que he encontrado hasta ahora:

Nota: S es la "puntuación de la clasificación"

  1. "linealmente ponderado" - utilizar una función como: S = (w1 * F1) + (w2 * F2) + (w3 * F3), donde wx se asignan pesos arbitrariamente, y Fx son los valores de los factores. También querrá normalizar F (es decir, Fx_n = Fx/Fmax). Creo que esto es un poco como Lucene search works.
  2. "Base-N ponderada" - más como agrupación de ponderación, que es sólo una ponderación lineal en el que los pesos están aumentando múltiplos de base 10 (un principio similar al CSS selector specificity), de modo que los factores más importantes son significativamente más altos: S = 1000 * F1 + 100 * F2 + 10 * F3 ... .
  3. estimado Valor Verdadero (ETV) - esto es al parecer lo Google Analytics introduced in their reporting, donde el valor de uno influencias de factores ( pesos) otro de los factores - la consecuencia de ordenar en valores más "estadísticamente significativos". El enlace lo explica bastante bien, así que aquí está la ecuación: S = (F2/F2_max * F1) + ((1 - (F2/F2_max)) * F1_avg), donde F1 es el factor "más importante" ("tasa de rebote" en el artículo), y F2 es el factor "modificador de significancia" ("visitas" en el artículo)
  4. Bayesian Estimate - se ve muy similar a ETV, así es como IMDb calcula su calificación. Ver this StackOverflow post for explanation; ecuación: S = (F2/(F2+F2_lim)) * F1 + (F2_lim/(F2+F2_lim)) × F1_avg, donde Fx son lo mismo que # 3, y F2_lim es el límite de umbral mínimo para el factor de "significancia" (es decir, cualquier valor menor que X no se debe considerar).

Opciones # 3 o # 4 aspecto muy prometedor, ya que en realidad no tiene que elegir un esquema de ponderación arbitraria como lo hace en el # 1 y # 2, pero el problema es ¿cómo se hace esto por más de dos factores?

También encontré el SQL implementation for a two-factor weighting algorithm, que es básicamente lo que necesitaré para escribir eventualmente.

+0

Para mayor claridad, ¿qué factor habría cambiado el peso de otros factores en su ejemplo? ¿Es uno de ellos mucho más importante que los otros, o simplemente desea evitar establecer pesos manualmente? – gankoji

+1

@gankoji Honestamente, no recuerdo (hace más de 2 años); Probablemente solo quería evitar el establecimiento manual de pesos, ya que cada vez que cambiamos de opinión con respecto a la importancia tendríamos que implementar el código, así como elegir los pesos correctos en primer lugar. – drzaus

+3

Lo siento, me di cuenta de que era una publicación de 2 años después del comentario. Iba a sugerirle que use lo que se llama una "solución de compromiso" en la jerga de optimización. Básicamente, usted elige el "punto" ideal absoluto en su espacio de solución (cartel de rango más alto, fecha más reciente, etc.) y luego el valor inverso de la distancia euclidiana desde ese punto sería su puntaje. es decir S = 1/(sqrt ((rank - rank_ideal)^2 + (age - age_ideal)^2 ... (xn - xn_ideal)^2); De todos modos, espero que lo hayas descifrado. – gankoji

Respuesta

0

Considere encadenar los pesos. P.ej. usted tiene 3 factores: X, Y y Z. Puede calcular ETVyz como W = (Z/Zmax * Y) + (1 - Z/Zmax) * Yavg para cada registro y luego calcular ETVxw como S = (W/Wmax * X) + (1 - W/Wmax) * Xavg. Puede encadenar más factores similares.

+2

pero no puedes normalizar 'W' (' W' contra 'Wmax') en la función para ** ETVxw **, porque ya es el resultado de factores internamente normalizados – drzaus

4

Como mencioné en los comentarios, sugeriría lo que se llama la "solución de compromiso" para cualquier persona con un problema similar que esté más preocupado por no tener que establecer ponderaciones que por hacer un criterio más ponderado que los demás.

Básicamente, considera cada uno de sus criterios como una coordenada (después de la normalización, por supuesto). Según su criterio, usted elige el punto óptimo absoluto, p. en este caso, el autor de rango más alto, el artículo más nuevo, etc. Una vez que elija la solución óptima, la 'solución' de cada uno se califica en función de su distancia de la óptima. Una fórmula de muestra sería la inversa de la distancia euclidiana para el puntaje de cada artículo: S = 1/(sqrt ((rank - rank_ideal)^2 + (age - age_ideal)^2 + ... + (xn - xn_ideal)^2)).

Esto trata todos los criterios como iguales, así que tenlo en cuenta.

+0

¿no será esta una división por cero si coincide exactamente? – Gokigooooks

+0

Sí, en el caso de que tenga un conjunto no único, es posible dividir por cero. Esto es trivial de manejar en código (calcule primero el divisor, compruebe si hay "pequeñez", error/descarte si es necesario). Dicho esto, en este caso de uso, la no exclusividad a) no se mencionó como una restricción yb) parece improbable, dado el tipo de conjunto de datos y la cantidad de dimensiones – gankoji

+0

Perdón por molestarlo Señor, pero tengo otra pregunta! ¿Qué pasa si los valores de cada criterio tienen una gran diferencia, como el criterio n. ° 1 varía de 1 a 30 y el criterio n. ° 2 varía en 1000+? Las ponderaciones se verían fuertemente atraídas por el criterio # 2, ¿no? ¿Cómo puedo normalizar esto? – Gokigooooks

Cuestiones relacionadas