Ранжирование продуктов
-
16-09-2019 - |
Вопрос
Мне нужно отсортировать некоторые продукты на основе оценок пользователей.
Предположим, у нас есть 3 продукта {a, b, c} и у нас есть отзывы пользователей об этих продуктах.Не важно, какой пользователь даст нам обратную связь (этот вопрос не о корреляционной фильтрации, если вы знакомы с ней - интересы пользователя здесь неуместны).
Каждая из приведенных ниже строк представляет собой отзывы пользователей, когда они пытались сравнить эти 3 продукта:
a 150 баллов - b 0 баллов (этот пользователь только что рассказал нам, что он думает о двух продуктах a и b, и при сравнении a и b он считает, что если он дает 150 баллов, то b стоит 0 баллов)
a 150 баллов - c 20 баллов
c 200 баллов - a 10 баллов (несмотря на предыдущее, этот пользователь считает, что c лучше, чем a)
a 200 баллов - b 40 баллов - c 100 баллов
a 150 баллов - b 50 баллов
a 150 очков - b 20 очков
(Эти рейтинги - всего лишь выборка, и в реальном мире количество продуктов и рейтингов намного больше этого)
Теперь мне нужен алгоритм для определения рейтинга продукта на основе голосов пользователей.На мой взгляд, лучший способ - описать эту проблему с помощью корреляционного графика и связать все продукты друг с другом.
Мы ценим любую помощь или советы.
/******************************************************************************/**
вы не можете просто сложить баллы и вычислить среднее значение баллов продукта, потому что важно, как он получил свои баллы предположим, что a набрал 800 баллов против b - тогда c получит 10 баллов против a следующим образом:
a 200 - b 0
a 200 - b 0
a 200 - b 0
a 200 - b 0
c 10 - a 0 (это означает, что c лучше, чем a)
так что определенно a лучше, чем b, но с небольшим отрывом в 10 очков c получил лучший рейтинг от a
/****************************************************************************/
Решение
Взгляни на http://msdn.microsoft.com/en-gb/magazine/dd148646.aspx?pr=blog.Он описывает пять «рейтинговых» систем.Контекст касается тестирования, но я думаю, что основные концепции достаточно хорошо применимы к вашей проблемной области.
Другие советы
Какой странный способ ранжирования.Я предлагаю для каждого пользователя создать рейтинг для всех продуктов, которые он поставил на первое место.Например, если пользователь делает это:
a 200 - b 0
c 10 - a 0
Затем вы можете преобразовать это в полный набор для пользователя следующим образом:
c 210 - a 200 - b 0
Затем вам нужно нормализовать (при условии, что все пользователи имеют одинаковый вес):
c 100 - a (200/210) - b 0
Затем, если пользователи имеют разный вес (другими словами, один пользователь имеет больше доверия, чем другой), вы можете сделать это (предположим, что авторитет этого пользователя равен 5):
c 100*5 - a (200/210)*5 - b 0
Сделав это, вы сможете суммировать все результаты для каждого продукта по всем пользователям.
Звучит довольно сложно.Я бы подошел к этому так, чтобы периодически пересматривать рейтинги и сохранять порядок сортировки в базе данных.Из того, что вы описали, это звучит как гигантская алгебраическая система.Я не знаю, можно ли это решить в БД, но даже если бы это было возможно, решение могло бы занять O (n ^ черт возьми) много времени, поэтому я чувствую, что кэширование здесь будет вашим другом.
Что касается фактического определения порядка сортировки, я бы составил список уравнений, например:
a = b + 400 c = a + 10
И как только вы создадите весь список, решите проблему целиком и кэшируйте рейтинги