Такой вот пост, что называется, не для всех. Ну, сами посудите: не у каждого нынче найдётся в хозяйстве знаменатель, да ещё такой, в который можно вот так запросто добавить единичку.
Для тех, кого по какой-то причине не отпугнул заголовок, отдельно сообщу, что на повестке дня — вопрос ранжирования неких условных элементов по результатам бинарных (равно как и любых дискретных) пользовательских оценок. Ну вот, наконец-то, все разбежались.
Так вот, на каждом первом веб-сайте полно всякой однотипной хрени. И на каждом полуторном для пользователей так или иначе реализована возможность эти хрени оценивать. Интерактив, знаете ли, в нашу вебдванольную эру весьма почитаем почтеннейшей публикой. По результатам всенародного (или частичнонародного, тут уж как вздумается творцам и самодержцам интернет-ресурсов) голосования строятся рейтинги. Скажем, «десять лучших хреней ударной пятилетки» и тэпэ.
Как построить рейтинг — зависит, конечно, прежде всего от того, как пользователям предлагается голосовать. Тут, по большому счёту, есть ровно два с половиной различных подхода.
Подход первый, академический. На пользователя взваливается титанический труд сделать мучительный выбор между, как правило, пятью оценками — как правило, от 1 до 5. Подход используется весьма широко. Вот, например, самый что ни на есть классический вариант реализован у нас в «Перлах преподавателей»:
Как правило, «общая оценка» (параметр, по которому строится рейтинг) в этом случае представляет собой просто средний балл из числа полученных голосов. Тут-то и порылась собака. Ведь что при этом получается: некое гениальнейшее творение добрая сотня человек в едином порыве оценивает высшим баллом, а один, скажем, просто из чувства противоречия ставит кол. Средний балл в итоге — 4.96. Другое (быть может, самое что ни на есть посредственное) получает единственную шальную пятёрку, что ставит её на высшую ступень рейтинга. Плохо.
Чтобы избежать таких неприятностей, можно, конечно, «принимать в рейтинг» только элементы, получившие не менее скольких-то-там голосов, но по мне это чистое мракобесие. Вообще, программируя что-либо, следует по возможности избегать констант, взятых с потолка. А предел количества голосов в этом случае именно оттуда всегда и берётся.
Кстати, вот эта вот пяти-(десяти-, восьмидесятидевяти-, и вообще)балльность сама по себе тоже всегда берётся с того же самого потолка. И школьно-институтская традиционность её нисколько не оправдывает.
Подход второй, бинарный. Пользователю предлагается всю широчайшую гамму чувств от прочитанного/увиденного выразить одним из двух доступных способов: либо понравилось (+1), либо нет (-1). Используется столь же широко, как и первый вариант. Вот, скажем, в «Цитатнике Рунета»:
В этом случае общей оценкой почти всегда является простая сумма всех полученных голосов. Как нетрудно догадаться, собака порылась и тут, причём точно такая же, но другая. 1000 голосов «за» и 950 голосов «против» (по всей видимости, что-то весьма посредственное) дают точно такой же результат, как и 50 голосов «за» и ни одного «против» (куда более перспективно). Что тоже далеко не айс.
Вскользь упомяну Подход второй с половиной, унарный, когда пользователю предоставлена в безраздельное пользование одна-единственная кнопка — «понравилось», и ему остаётся лишь решить, нажимать её, или нет. Такие порядки царят, скажем на «IT happens». Казалось бы, чем проще — тем лучше. Но нет, тут всё совсем плохо.
Во-первых, пользователь чувствует себя обделённым и глубоко несчастным, не имея возможности сказать своё веское «ацтой». Во-вторых, например, итоговая сумма «50» может получиться и у гениальнейшего творения, волею судеб просмотренного ровно 50-ю посетителями, и у некой посредственности, увиденной многими тысячами.
Последний рассмотренный случай не заслужил номера «3» по причине своей ущербности и хронической неизлечимости от недостатков. Первые же два лечатся. И не чем иным, как той самой единичкой в знаменателе, ради которой автор этих строк наколотил выше почти 4000 знаков.
Общая оценка = {Сумма голосов}/({Количество голосов} + 1)
Вот так просто и первый, и второй методы оценивания/ранжирования избавляются от пагубной зависимости от количества голосов.
Пока эта нехитрая идея у меня тут внедрена только в «Шедеврах скибатронной живописи» (большая цифирь — это как раз та самая оценка, только для красивости ещё умноженная на 100).
При определении пятёрки моих лучших (по мнению читателей) записей пока используется простая сумма голосов, по которой далеко вперёд вырвалось весьма спорное со всех точек зрения, но шибко раскрученное «Математическое порно». Но если взять на вооружение всё написанное выше, то лидерство перехватят куда более высокохудожественные «Финита ля год» и «Простудифилис и гриппер», а «порно» сдвинется аж на 29-ю позицию. Что зело любо моей поэтической натуре.
P.S. Вообще-то, я просто хотел написать о том, что уже практически помер от жары, и что уснуть нихрена не получается. Ну да ладно.
(5+1)/3 против (5+1)/2
(50+1)/12 против (50+1)/11
(500+1)/102 против (500+1)/11
В чем, собственнно, разница?
Да, 5/2 будет хуже, чем (50+1)/12
При большом количестве голосов разницы, и правда, нет. Но если речь идёт о первых единицах, то разница существенна.
1/1 и 100/100 - это ведь не должно быть одно и то же, верно?
А 1/2 и 100/101 - уже существенно различается, что и требуется.
Но это же тоже некая константа. Почему взята именно она? Почему ты не взял 10? 18?
Если V - сумма голосов, а N - количество проголосовавших, то V/N - это текущий средний балл.
А V/(N+1) - это математическое ожидание** этой величины при поступлении (N+1)-го, ещё неизвестного нам голоса, который, как мы считаем, может быть любым с равной вероятностью.
Если вместо единицы мы возьмём любое другое натуральное число K, то рейтинговой оценкой будет матожидание среднего после N+K-го голоса. Чем больше K, тем больше неопределённость, и тем менее достоверна будет оценка.
Так что, беря минимальное возможное K=1, мы с одной стороны, вносим необходимую неопределённость, а с другой - максимизируем достоверность оценки.
**) Вообще-то, в числителе к V нужно прибавить ещё среднее из всех возможных голосов. При оценке +1/-1 это ноль. А если, скажем, пользователь выставляет от 1 до 5 баллов, то матожидание на N+1-м шаге равно (V+3)/(N+1), на K-м шаге - (V+3K)/(N+K).
Уважаемый Lexxus!
Скорее, скорее выпейте воды и отправляйтесь в прохладный погреб. Вам перегрело "моск".
Спасение интернет-сообщества от неверных систем оценки, конечно, дело хорошее со всех точек зрения, но, поверьте, Ваш уникальный интеллект и взгляд на мир достоен обратить своё внимание на более философские проблемы.
Спасите себя от самоуничтожения и нас от потери Вас!
челом бьёт