Алгоритм ранжирования в приложении рельсов - PullRequest
3 голосов
/ 30 декабря 2011

В нашем приложении ralis есть модель, объектам которой присваивается оценка на основе положительных действий пользователя.Мы будем называть их продуктами для простоты.Если пользователю нравится продукт, или он покупает продукт, или просматривает продукт, оценка увеличивается с разным весом (подобное может стоить больше, чем просмотр, два просмотра в течение 30 секунд могут стоить больше, чем три просмотра по всемучас и т. д.)

Мы хотели бы использовать эти оценки для сортировки и ранжирования товаров, скажем, для списка популярных товаров, но по разным причинам - использование прямого ранжирования будет неравномерно благоприятствовать пожилымпродуктов, поскольку у них будет больше времени, чтобы набрать более высокий балл.

Мой вопрос заключается в том, как нормализовать баллы между новыми и старыми продуктами.Я думал о том, чтобы разделить оценку продуктов на единицу времени, скажем, количество дней, в течение которых они существовали, но я беспокоюсь, что слишком сильно урежет старые продукты.Есть какие-нибудь мысли о том, как лучше нормализовать оценки между старыми и новыми продуктами?

Я также рассматриваю пример байесовской рейтинговой системы, которую я нашел в другом вопросе:

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

Где avg числа рассчитываются путем просмотра баллов по всем продуктам, которые имеют более одного vote (или в нашем случае, положительный action).Это может быть не лучшим способом, потому что у нас нет отрицательного рейтинга в нашей системе, и это вообще не учитывает время.

1 Ответ

3 голосов
/ 30 декабря 2011

Ваш вопрос напоминает мне концепцию Экспоненциального дисконтирования денежных потоков в финансах .

Концепция заключается в следующем: 100 долларов за два года на сумму менее 100 долларов в год, чтостоимостью менее 100 $ сейчас, ...

Я думаю, что мы можем сделать хорошее сравнение здесь: продукт вчерашнего дня стоит больше, чем продукт предыдущего дня, но меньше, чем продукт сегодня.

Формула проста:

Vn = V0 * (1-t)^n

с V0 начальным значением (реальное количество голосов "за"), t ставка дисконтирования (выдолжны исправить это, например, на 10%) и n прошедшее время (например, n дней).Таким образом, продукт будет терять 10% своей стоимости каждый день (но 10% предыдущего дня, а не первоначальной стоимости).

Вы также можете увидеть Гиперболическое дисконтирование , которое ближе ктвоя попыткаФормула может выглядеть примерно так:

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

Другой подход, более простой, но грубый: линейное дисконтирование.Вы можете просто дать начальное значение для баллов, например 1000, и каждый день вы уменьшаете все баллы на 1 (или другую константу).

Vn = V0 - k*n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...