Алгоритм ранжирования

Мне нужно отсортировать некоторые продукты на основе оценок пользователей.

Предположим, у нас есть 3 продукта {a,b,c}, и у нас есть отзывы пользователей об этих продуктах. Неважно, какой пользователь оставил нам отзыв (этот вопрос не о корреляционной фильтрации, если вы знакомы с ней - интересы пользователей здесь не имеют значения)

Каждая из приведенных ниже строк представляет собой отзывы пользователей, когда они пытались сравнить 3 продукта:

a 150 баллов - b 0 баллов (этот пользователь только что сказал нам, что он думает о 2 продуктах a и b, и в сравнении a и b он подумал, что если он даст 150 баллов, тогда b стоит 0 баллов)

a 150 баллов – c 20 баллов

c 200 баллов - a 10 баллов (несмотря на предыдущий этот пользователь считает, что c лучше, чем a)

a 200 баллов - b 40 баллов - c 100 баллов

а 150 баллов - б 50 баллов

а 150 баллов - б 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

/********************************************************************************/


person EBAG    schedule 17.07.2009    source источник


Ответы (3)


У вас есть некоторые проблемы. Добавьте рейтинг c 0 - b 20, и вы получите круг, где c ‹ b ‹ a ‹ c.

И, конечно же, ваш порядок не только не транзитивен (из a ‹ b ‹ c не следует a ‹ c), но и не тотален (могут быть элементы, которые вы не можете решить, что лучше, потому что нет было проведено голосование пользователей, даже через другие элементы.

Вы получаете несвязный, направленный, конечный граф. (используйте направление ребер, чтобы сказать, какой элемент (узел) лучше).

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

Возможно, вам поможет теория порядка в математике: поищите теория порядка, частичный порядок, Диаграмма Хассе.

Чтобы сделать это более практичным:

Используйте двумерный массив со строкой и столбцом для каждого элемента. В ячейке (a,b) посчитайте сумму оценок. Начиная с определенного элемента a, следуйте всем положительным (> 0) соединениям, пока не достигнете узла, у которого нет положительных соединений, или не вернетесь к узлу, который вы уже посетили. Эти узлы — ваши решения.

person Ralph M. Rickenbach    schedule 17.07.2009

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

person Codebeef    schedule 17.07.2009
comment
Байсовская рейтинговая система работает, когда элементы оцениваются, но не когда они оцениваются по отношению к другим элементам. - person Ralph M. Rickenbach; 17.07.2009

Я думаю, вам нужно указать, как каждый человек проголосовал за каждый продукт, например: человек 1 проголосовал: 100 за a, 50 за b и 0 за c; человек 2 проголосовал 0 за a, 200 за b и 80 за c
< br> это следует перевести следующим образом:
человек 1 проголосовал 3 за a, 2 за b и -1 за c
человек 2 проголосовал -1 за a, 3 за b и 2 за c

где я использую:
3 для самого высокого голоса
2 для второго по величине
1 для самого низкого
И -1, если они проголосовали 0 (указывает, что они не любили/не рассматривали продукт)

во всяком случае моя первоначальная мысль об этом

person meade    schedule 17.07.2009