2012-01-06 11 views
22

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"

  1. "linearmente ponderata" - utilizzare una funzione come: S = (w1 * F1) + (w2 * F2) + (w3 * F3), dove wx vengono assegnati pesi arbitrariamente e Fx sono i valori dei fattori. Dovresti anche normalizzare lo F (ad esempio Fx_n = Fx/Fmax). Penso che questo sia un po 'come Lucene search works.
  2. "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 ... .
  3. 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), dove F1 è il fattore "più importante" ("frequenza di rimbalzo" nell'articolo) e è il fattore di "modifica della significatività" ("visite" nell'articolo).
  4. 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, dove Fx sono uguali a # 3 e F2_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.

+0

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

+1

@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

+3

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

risposta

0

Considerare il concatenamento dei pesi. Per esempio. hai 3 fattori: X, Y e Z. È possibile calcolare ETVyz come W = (Z/Zmax * Y) + (1 - Z/Zmax) * Yavg per ogni record e quindi calcolare ETVxw come S = (W/Wmax * X) + (1 - W/Wmax) * Xavg. È possibile concatenare più fattori similari.

+2

ma non puoi normalizzare 'W' (il' W' vs 'Wmax') nella funzione per ** ETVxw **, perché è già il risultato di fattori internamente normalizzati – drzaus

4

Come accennato nei commenti, suggerirei quella che viene chiamata la "soluzione di compromesso" per chiunque abbia un problema simile che si preoccupa maggiormente di non dover impostare pesi piuttosto che rendere un criterio più pesantemente ponderato rispetto agli altri.

Fondamentalmente, si considera ciascun criterio come coordinata (dopo la normalizzazione, ovviamente). In base al tuo giudizio, scegli il punto ottimale assoluto, ad es. in questo caso, l'autore di rango più alto, l'ultimo articolo, ecc. Una volta scelta la soluzione ottimale, l'altra "soluzione" viene valutata in base alla sua distanza da quella ottimale. Una formula di esempio sarebbe l'inverso della distanza euclidea per il punteggio di ciascun articolo: S = 1/(sqrt ((rank - rank_ideal)^2 + (age - age_ideal)^2 + ... + (xn - xn_ideal)^2)).

Questo tratta tutti i criteri come uguali, quindi tenetelo a mente.

+0

non è una divisione per zero se colpisce esattamente la stessa corrispondenza? – Gokigooooks

+0

Sì, nel caso in cui si disponga di un insieme non univoco, è possibile dividere per zero. Questo è banale da gestire nel codice (calcolare prima il divisore, controlla "smallness", error/throw out se necessario) .Questo, in questo caso d'uso, la non-unicità a) non è stata menzionata come un vincolo eb) sembra improbabile, dato il tipo di set di dati e il numero di dimensioni. – gankoji

+0

Scusa se ti disturbo, signore, ma ho un'altra domanda! cosa succede se i valori di ciascun criterio hanno una differenza molto grande come il criterio n. 1 varia da 1 a 30 e il criterio 2 è compreso tra 1000 e oltre? I pesi sarebbero pesantemente trainati dal criterio n. 2 giusto? come posso normalizzare questo? – Gokigooooks

Problemi correlati