Devo fornire un ordinamento ponderato su 2 fattori, ordinati per "pertinenza". Tuttavia, i fattori non sono completamente isolati, nel senso che voglio che uno o più fattori influenzino l '"urgenza" (peso) degli altri.Come fornire i risultati più rilevanti con l'ordinamento ponderato con più fattori
Esempio: contenuto del contributo (articoli) può essere up-/down-votato, e quindi avere un rating; hanno una data di postazione e sono anche taggati con categorie. Gli utenti scrivono gli articoli e possono votare, e possono o meno avere un qualche tipo di classifica (esperto, ecc.). Probabilmente simile a StackOverflow, giusto?
voglio fornire a ciascun utente con un elenco di articoli raggruppati per tag, ma ordinati per "pertinenza", dove pertinenza è calcolato sulla base del rating e l'età di questo articolo, e forse influenzata dalla classifica dell'autore . OSSIA un articolo altamente classificato che è stato scritto diversi anni fa potrebbe non essere necessariamente rilevante quanto un articolo di media classifica scritto ieri. E forse se un articolo fosse stato scritto da un esperto sarebbe considerato più rilevante di uno scritto da "Joe Schmoe".
Un altro buon esempio potrebbe essere assigning hotels a "meta score" comprised of price, rating, and attractions.
La mia domanda è, qual è il miglior algoritmo per l'ordinamento a più fattori? Questo può essere un duplicato di that question, ma sono interessato a un algoritmo generico per qualsiasi numero di fattori (un'aspettativa più ragionevole è di 2 - 4 fattori), preferibilmente una funzione "completamente automatica" che non devo modificare o richiedono input da parte dell'utente e non riesco a analizzare l'algebra lineare e l'autenticità degli autovettori.
possibilità che ho trovato finora:
Nota: S
è il "punteggio di smistamento"
- "linearmente ponderata" - utilizzare una funzione come:
S = (w1 * F1) + (w2 * F2) + (w3 * F3)
, dovewx
vengono assegnati pesi arbitrariamente eFx
sono i valori dei fattori. Dovresti anche normalizzare loF
(ad esempioFx_n = Fx/Fmax
). Penso che questo sia un po 'come Lucene search works. - "Base-N ponderata" - più come raggruppamento di ponderazione, è solo un coefficiente lineare dove i pesi sono in aumento multipli di base 10 (un principio simile a CSS selector specificity), in modo che i fattori più importanti sono significativamente superiori:
S = 1000 * F1 + 100 * F2 + 10 * F3 ...
. - stimato True Value (ETV) - questo è apparentemente quello Google Analytics introduced in their reporting, in cui il valore di uno influenze fattore (pesi) un altro fattore - la conseguenza è quello di ordinare su valori più "statisticamente significativi". Il collegamento lo spiega abbastanza bene, quindi ecco solo l'equazione:
S = (F2/F2_max * F1) + ((1 - (F2/F2_max)) * F1_avg)
, doveF1
è il fattore "più importante" ("frequenza di rimbalzo" nell'articolo) e è il fattore di "modifica della significatività" ("visite" nell'articolo). - Stima Bayesiano - sembra molto simile a ETV, questo è il modo in cui IMDb calcola la propria valutazione. Vedi this StackOverflow post for explanation; equazione:
S = (F2/(F2+F2_lim)) * F1 + (F2_lim/(F2+F2_lim)) × F1_avg
, doveFx
sono uguali a # 3 eF2_lim
è il limite minimo di soglia per il fattore "significanza" (vale a dire qualsiasi valore inferiore a X non deve essere considerato).
Opzioni # 3 o # 4 look davvero promettente, dal momento che non hanno veramente a scegliere un sistema di ponderazione arbitraria come si fa a # 1 e # 2, ma il problema è come si fa a fare questo per più di due fattori?
Mi sono imbattuto anche nello SQL implementation for a two-factor weighting algorithm, che è fondamentalmente ciò che dovrò scrivere alla fine.
Solo per chiarezza, quale fattore avresti modificato i pesi di quali altri fattori nel tuo esempio? Uno di questi è molto più importante degli altri, o vuoi semplicemente evitare di stabilire manualmente i pesi? – gankoji
@gankoji Onestamente non ricordo (più di 2 anni fa); Probabilmente volevo solo evitare di stabilire manualmente i pesi, dal momento che ogni volta che abbiamo cambiato idea riguardo all'importanza dovevamo implementare il codice, oltre a scegliere i pesi corretti in primo luogo. – drzaus
Scusa, ho capito che era un post di 2 anni dopo il commento. Stavo per suggerire di utilizzare quella che viene definita una "soluzione di compromesso" nel gergo di ottimizzazione. Fondamentalmente, scegli il "punto" assoluto ideale nello spazio della tua soluzione (poster di rango più alto, data più recente, ecc.) E quindi l'inverso della distanza euclidea di quel punto sarebbe il tuo punteggio. cioè S = 1/(sqrt ((rank - rank_ideal)^2 + (age - age_ideal)^2 ... (xn - xn_ideal)^2); Comunque, spero che tu abbia capito ... – gankoji