Алгоритм взвешенного голосования / Расчет - PullRequest
3 голосов
/ 26 февраля 2011

Я создаю приложение «дуэль» и зашел в тупик для подсчета результатов.

У каждого пользователя есть как положительный, так и отрицательный голос. Там нет 1-5 или пятизвездочного рейтинга.

Например: если бы меня отображали 5 раз и выиграли 3, у меня было бы 3 «положительных голоса» и 2 «отрицательных».

Если бы я делал прямые проценты, любой, кто отображался 1 раз и выбирал 1 раз (100%), всегда был бы верхом, где, как если бы кто-то был 9/10 (90%), он был бы ниже 1/1, но в теория будет принадлежать к вершине.

У кого-нибудь есть идеи, как этого добиться?

Ответы [ 4 ]

4 голосов
/ 22 мая 2011

Я тоже искал подходящий алгоритм для веб-сайта голосования.

Хотя то, что предложил @joshhendo, похоже, будет правильным методом ранжирования голосов, он не учитывает процентположительных голосов.

Например:

  • Пункт 1 имеет 70 голосов "за" и 30 голосов "за".
  • Пункт 2 имеет 400 голосов "за"голосов и 300 голосов «против».

За пункт 1: 70-30 = 40Для пункта 2: 400-300 = 100

Пункт 2 появится над пунктом 1, поскольку он имеет больше положительных голосов.Но пункт 2 имеет только 25% положительных голосов, тогда как пункт 1 имеет ~ 57% положительных голосов.Пункт 1 должен явно появиться над пунктом 2, потому что, несмотря на то, что у него не так много общих голосов, он имеет лучшее соотношение голосов «вверх» и «вниз».

Но опять же, каждый хочетИзбегайте первоначальной проблемы элементов с 1 голосом (положительным), появляющихся выше всего остального.

Я рекомендую вам прочитать это: http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

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

[править]Это также очень хорошее чтение: http://blog.linkibol.com/2010/05/07/how-to-build-a-popularity-algorithm-you-can-be-proud-of/[/ Править]

2 голосов
/ 22 мая 2011

Вместо положительного процента голосов, отследите среднее значение по Байесу, например ::1001

(positive votes + weighted avg positive votes) / (total votes + arbitrary sample)

http://en.wikipedia.org/wiki/Bayesian_average

2 голосов
/ 26 февраля 2011

Вы могли бы просто подсчитать голоса, при этом количество голосов "за" и "+1" и число голосов за "против" равно -1.

Например, скажем, кто-то был 9/10 (например, у него было 9голосов "за" и "1", тогда их оценка будет 9 + -1 = 8.Это выше, чем 1/1, у кого 1 голос "за" и 0 голосов "за", поэтому их оценка будет 1 + -0 = 1.Итак, у человека, который получил бы 90% в вашей процентной системе, теперь есть 8 баллов, что выше, чем у человека, который получил бы 100% с баллом 1.

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

0 голосов
/ 26 февраля 2011

Вы можете иметь взвешенный счет.

отслеживать очки каждого пользователя, а рейтинг-рейтинг

пусть q будет счет ваших оппонентов (который находится в диапазоне от 0 до 1 включительно для обоихзаканчивается.)

Когда вы сражаетесь, вы набираете 1-q очков, когда выигрываете, и теряете q очков, когда проигрываете.Это означает, что если вы проиграете против того, кто всегда побеждает, это не причинит вам большой вред.Если вы проиграете кому-то, кто почти всегда проигрывает, вы потеряете за это много очков.

Каждый (день, час, что угодно) пересчитывает q каждого, где # 1 человек получает aq 1 (или 1,5, или 2, что угодно, но 1 работает лучше всего), а самый низкий человек получает aq 0.

...