Еще немного о рейтингах

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

Рейтинг пользователей

В данной теме я коснусь только голосования за пользователей, потому как другие рейтинги могут быть выражены так же.

Приращение рейтинга пользователя при голосовании за него ("+") складывается из двух составляющих:
  • часть, которая зависит от Рейтинга этого пользователя
  • часть, которая зависит от Силы голосующего пользователя

Чуть позже я объясню, как эти части считаются, а пока выберем значение maxDeltaValue, которое является максимальным приращением рейтинга пользователя. В моей модели это не совсем так, т.е. возможны превышения этого значения, но не на большую величину. Далее будет понятно, почему это так. В принципе, можно было бы потом подгонять полученное значение рейтинга в диапазон от 0 до maxDeltaValue, но тут уже нужно оперировать с остатком от деления, чего не хочется.

Итак, примем, что первая часть приращения будет составлять 20% от максимального, а вторая — 80%. Т.е. основной вклад в приращение вносит именно Сила голоса голосующего пользователя.

В итоге имеем:
dРейтинг_a = F_1(Рейтинг_a) + F_2(Сила_b) <= maxDeltaValue


F_1 и F_2 — это некоторые функции, по которым рассчитываются составляющие приращения, зависящие от Рейтинга пользователя, за которого голосуют и Силы того, кто голосует соответственно.

Первая часть приращения
Сразу приведу формулу, которую я выбрал:
F_1(Ra) = a * exp(-b*Ra)

Зависимость по экспоненте взял, потому как нужна была убывающая функция. Почему? Чтобы уменьшалось значение приращение с ростом рейтинга пользователя. Это сделано, чтобы поддерживать новичков и рейтинги старичков не взлетали до небес (с этой точки зрения).
Указанная функция будет стремиться к 0 с ростом значения рейтинга. Максимальное же значение в диапазоне рейтингов от 0 до бесконечности будет достигаться в 0. Это значение будет равно параметру a. Коэффициент b же отвечает за скорость убывания функции, его можно выбрать.
Т.к. мы предположили, что первая часть приращение вносит вклад в общее приращение до 20%, сл. параметр a = 0.2 * maxDeltaValue.

Вторая часть приращения
Здесь я использую возрастающую функцию. В данном случае — логарифм (натуральный). Сначала хотел использовать функцию, имеющую асимптоту.
Немного скажу про Силу рейтинга в моем случае. Он не является отдельной величиной, а выражается через рейтинг. Той же самой логарифмической зависимостью. График функции такого логарифма должен проходить через точки (0;1) — при нулевом рейтинге (новый пользователь) Сила голоса равна 1. Также график проходит через точку (-N; 0). Значение -N говорит о том, при каком значении рейтинга пользователь теряет Силу голоса. Решив простую систему уравнений можно получить функцию логарифма.

Вернемся к расчету второй части приращения:
F_2(Sb) = log(a*x + b)

Вообще говоря, Сила пользователя изменяется от 0 до примерно 5. Но переломный момент в логарифмической функции возьмем в точке 2. Таким образом, после Силы 2 значение функции будет расти, но уже несильно.
Такое значение как раз и будет тема 80% от maxDeltaValue. Назовем это значение параметром M.
В итоге получаем следующую формулу:
F_2(Sb) = log(((exp(M) - 1) / 2) * Sb + 1)


Итог

Итоговое приращение рейтинга пользователя равно сумме указанных выше двух частей. Стоит отметить, что эти части являются абсолютными значениями, то есть рассмотрено голосование в сторону "+". Думаю, понятно, как это будет работать при голосовании в "-".

А теперь мне хотелось бы услышать отзывы, критику и предложения по поводу формул.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.