3 Stimmen

Ranking-Algorithmus in einer Rails-App

Wir haben in unserer ralis-App ein Modell, dessen Objekte auf der Grundlage positiver Benutzeraktionen eine Punktzahl erhalten. Wir nennen sie der Einfachheit halber Produkte. Wenn einem Nutzer ein Produkt gefällt, er es kauft oder anschaut, wird die Punktzahl mit unterschiedlicher Gewichtung erhöht (ein "Like" kann mehr wert sein als ein "View", zwei "Views" innerhalb von 30 Sekunden können mehr wert sein als drei "Views" über eine Stunde verteilt usw.)

Wir würden diese Punktzahlen gerne verwenden, um Produkte zu sortieren und einzustufen, z. B. für eine Liste beliebter Produkte, aber aus verschiedenen Gründen wird die Verwendung des direkten Rankings ältere Produkte ungleichmäßig bevorzugen, da sie mehr Zeit hatten, eine höhere Punktzahl zu erreichen.

Meine Frage ist, wie man die Punktzahlen zwischen neuen und alten Produkten normalisieren kann. Ich habe darüber nachgedacht, die Produktbewertung durch eine Zeiteinheit zu teilen, z. B. durch die Anzahl der Tage, die das Produkt bereits existiert, aber ich befürchte, dass dies die älteren Produkte zu sehr einschränken würde. Hat jemand eine Idee, wie man die Punktzahlen zwischen alten und neuen Produkten am besten normalisieren kann?

Ich denke auch an ein Beispiel für ein bayesianisches Bewertungssystem, das ich in einer anderen Frage gefunden habe:

rating = ((avg_num_votes * avg_rating) + (product_num_votes * product_rating)) / (avg_num_votes + product_num_votes)

Wo die avg Die Zahlen werden berechnet, indem die Punktzahlen aller Produkte, die mehr als ein Produkt haben, betrachtet werden. vote (oder in unserem Fall eine positive action ). Dies ist vielleicht nicht der beste Weg, da wir in unserem System keine negative Bewertung haben und die Zeit überhaupt nicht berücksichtigt wird.

3voto

Thomas Guillory Punkte 5659

Ihre Frage erinnert mich an das Konzept der Exponentielle Diskontierung des Cashflows im Finanzwesen .

Das Konzept ist das folgende: 100$ in zwei Jahren sind weniger wert als 100$ in einem Jahr, das weniger wert ist als 100$ jetzt, ...

Ich denke, dass wir hier einen guten Vergleich anstellen können: ein Produkt von gestern ist mehr wert als ein Produkt von vorgestern, aber weniger als ein Produkt von heute.

Die Formel ist einfach:

Vn = V0 * (1-t)^n

con V0 den Ausgangswert (die tatsächliche Anzahl positiver Stimmen), t einen Abzinsungssatz (Sie müssen ihn festlegen, etwa 10%) und n die vergangene Zeit (z. B. n Tage). So verliert ein Produkt jeden Tag 10 % seines Wertes (aber 10 % des vorangegangenen Tages, nicht des ursprünglichen Wertes).

Sie können auch sehen Hyperbolische Diskontierung das ist näher an Ihrem Versuch. Die Formel kann etwas wie das sein, denke ich:

Vn = V0 * (1/(1+k*n))

Eine andere, einfachere, aber grobe Methode ist die lineare Diskontierung. Sie können einfach einen Anfangswert für die Punktzahlen angeben, z. B. 1000, und jeden Tag alle Punktzahlen um 1 (oder eine andere Konstante) verringern.

Vn = V0 - k*n

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X