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"
- "linealmente ponderado" - utilizar una función como:
S = (w1 * F1) + (w2 * F2) + (w3 * F3)
, dondewx
se asignan pesos arbitrariamente, yFx
son los valores de los factores. También querrá normalizarF
(es decir,Fx_n = Fx/Fmax
). Creo que esto es un poco como Lucene search works. - "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 ...
. - 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)
, dondeF1
es el factor "más importante" ("tasa de rebote" en el artículo), yF2
es el factor "modificador de significancia" ("visitas" en el artículo) - 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
, dondeFx
son lo mismo que # 3, yF2_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.
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
@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
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