Комментарии 56
Спасибо, заставили задуматься. Ваш способ кажется достаточно интересным. Попытаюсь просимулировать на текущей базе пользователей своего проекта.
Рейтинг голосующего равен нулю и получаем fatal error
А вообще идея интересная
Идея то не новая — здесь закладывается принцип экспертных оценок по рангам и опыту. Только пока ранги и опыт сомнительны и попахивают дедовщиной.
При умножении 0 ничего страшного не происходит. Он все равно передает вес в 1н бал.
Протестируйте прям с этого примера.
только выберите для вас угодный:
$a = 0;
$b = rand(0,5000);
Протестируйте прям с этого примера.
только выберите для вас угодный:
$a = 0;
$b = rand(0,5000);
сорри, пропустил if($b<=0){ $b=1; }
допустим, рейтинг пользователя получающего голос $b = 0; (он еще не имеет никакого рейтинга на сайте)
if ($result > $b / 2){ $result = (int) round($b / 2); }
// =>
if ($result > 0 / 2) { $result = (int) round(0 / 2); }
// =>
if ($result > 0) { $result = (int) round(0); }
// =>
if ($result > 0) { $result = 0 }
У вас учитывается голый результат голосовалки пользователей. В оценки материала или того же пользователя стоит обращать еще внимание на качество источника оценки. Если это дискуссионные форумы — то в расчет можно брать:
а) Активность в том или ином разделе с оценкой его активности и качества информации другими пользователями
б) Опыт (срок пребывания) с учетом частоты посещения
в) Оценка полезности (если ресурс с адекватными личностями — то может быть рассчитан)
г) Законопослушность и чистоту аккаунта
д) другие характеристики.
Голая цифра плюсов или минусов не защищает алгоритм от фобов. А вот они массой могут любую статистику поломать фанатично гонясь за самоутвержденного идола.
И все-таки — это имхо, которым может быть можно было бы дополнить ваши изыскания =)
а) Активность в том или ином разделе с оценкой его активности и качества информации другими пользователями
б) Опыт (срок пребывания) с учетом частоты посещения
в) Оценка полезности (если ресурс с адекватными личностями — то может быть рассчитан)
г) Законопослушность и чистоту аккаунта
д) другие характеристики.
Голая цифра плюсов или минусов не защищает алгоритм от фобов. А вот они массой могут любую статистику поломать фанатично гонясь за самоутвержденного идола.
И все-таки — это имхо, которым может быть можно было бы дополнить ваши изыскания =)
кстати, автор — СИшник?
откуда такое обилие depracated "
откуда такое обилие depracated "
#
" и "/**/
" в коде для комментариев вместо "//
"? )Это привычка комментариев крупных кусков и выделений важных элементов.
depracated "#" и "/**/"
Кхм… Пруфом не поделитесь?
Написано Comments starting with '#' are now deprecated in .INI files. (http://php.net/manual/en/migration53.deprecated.php)
Я был бы признателен, если бы кто-то прояснил ситуацию, причем здесь .INI файлы
Я был бы признателен, если бы кто-то прояснил ситуацию, причем здесь .INI файлы
Я имел ввиду depracated "#", но не "/**/"
Но пруф что-то не нашел. Возможно, что перепутал. Единственное, что нашел
Возможно, из-за этого и перепутал. Но, имхо, // менее шумно, чем #
Но пруф что-то не нашел. Возможно, что перепутал. Единственное, что нашел
Опции php.ini
Так же в конфигурационном файле теперь нельзя использовать Си-комментарии, то есть комментарии, начинающиеся с символа '#
Возможно, из-за этого и перепутал. Но, имхо, // менее шумно, чем #
Я извиняюсь, но deprecated.
Сразу подумалось что аналогия с гипотенузой не совсем правильная. Помоему было бы правильней рассматривать как сумму векторов, конкретно в вашему случае это ничего не меняет в рассчетах. Зато можно добится интересного эффекта если делать карму многомерной ;)
Еще раз посмотрел код. Он на самом деле избыточен. У вас излишняя увлеченность комментариями (много лишних комментариев в коде — это плохо). Лучше заменить их более внятным кодом.
Например кусок
Комментарий полностью повторяет код. Зачем? Он — лишний и мешает восприятию.
И теорему Пифагора все знают. Зачем её повторять в комментариях? Может еще и мануал по функциям процитировать?
По-моему всем разработчикам надо запретить пользоваться комментариями и разрешать только тогда, когда они научатся писать такой код, чтобы он был понятным и без комментариев.
Весь код можно сократить до такого вида и уйдёт большинство непоняток:
Например кусок
$result = (int) round($c / $b);
/* Делим полученный результат гипотенузы на содержимое стороны $b и сводим значение в целое с помощью округления и превращения числа в int */
Комментарий полностью повторяет код. Зачем? Он — лишний и мешает восприятию.
И теорему Пифагора все знают. Зачем её повторять в комментариях? Может еще и мануал по функциям процитировать?
По-моему всем разработчикам надо запретить пользоваться комментариями и разрешать только тогда, когда они научатся писать такой код, чтобы он был понятным и без комментариев.
Весь код можно сократить до такого вида и уйдёт большинство непоняток:
function hypotenuseKarmaChange ($userKarma, $targetKarma) {
// Экспериментально определено, что умножение на два делает результат более естественным
// При значениях меньше единицы карма будет уходить вниз или происходить деление на ноль
$u = max( $userKarma, 1) * 2;
$t = max($targetKarma, 1);
$hypotenuse = sqrt($u*$u + $t*$t);
$change = round($hypotenuse / $t);
$maxChange = round($t / 2);
return min($change, $maxChange);
}
echo hypotenuseKarmaChange(125, 18);
Вообще спасибо за оптимизацию.
Но в данном случае главное не реализация кода, а сама идея.
Но в данном случае главное не реализация кода, а сама идея.
ну просто идею тяжело понять, если код, который вмещается в 5 строчек распростёрся на страницу.
идея интересная, конечно, с этим согласен и плюс поставил.
только не хватает аргумента, в какую сторону изменять карму — в большую и меньшую. а тут уже надо думать пожоще. например. человек с кармой 250 минусует человека с кармой 150. а если наоборот? а если минусуют человека в глубоком минусе? и т.д.
идея интересная, конечно, с этим согласен и плюс поставил.
только не хватает аргумента, в какую сторону изменять карму — в большую и меньшую. а тут уже надо думать пожоще. например. человек с кармой 250 минусует человека с кармой 150. а если наоборот? а если минусуют человека в глубоком минусе? и т.д.
Если взять пример моего кода, то вы получаете результат.
Это число 11. А отнять или добавить, это дело ваше и 1й строчки.
Лучше скопируйте и вставьте его на какой-то тестовый сайт ваш (я специально держу на виртуалке спец. сайт)
>> если минусуют человека в глубоком минусе?
если у пользователя 0 и меньше, то снимается исключительно по 1 баллу.
Это число 11. А отнять или добавить, это дело ваше и 1й строчки.
Лучше скопируйте и вставьте его на какой-то тестовый сайт ваш (я специально держу на виртуалке спец. сайт)
>> если минусуют человека в глубоком минусе?
если у пользователя 0 и меньше, то снимается исключительно по 1 баллу.
Ну я обычно делаю так:
Теперь понял. Согласен.
В топике не хватает десятка примеров, чтобы сходу оценить работу алгоритма.
shock@localhost:~> php test.php
Теперь понял. Согласен.
В топике не хватает десятка примеров, чтобы сходу оценить работу алгоритма.
Проблема в том, что нужно привести не менее сотни примеров.
начиная от
negative->negative
negative->positive
positive->positive
и так далее + сильный разброс чисел.
Это нужно это видеть глазами чтоб почувствовать действие.
Простите за плохое оформление темы =(
Следующую статья я оформлю более интересно.
начиная от
negative->negative
negative->positive
positive->positive
и так далее + сильный разброс чисел.
Это нужно это видеть глазами чтоб почувствовать действие.
Простите за плохое оформление темы =(
Следующую статья я оформлю более интересно.
Я один не могу проследить логическую связь между рейтингом и гипотенузой?
Вообще лучше было бы внятно объяснить алгоритм на словах и формулами, обосновать, почему это стоит применять собственно к рейтингу и в конце уже привести исходный код,… желательно красивый исходный код, к примеру, как в комментарии выше.
Статья мне не понравилась, но тема очень интересна, не хватает таких материалов, так что, уважаемый автор, работайте над презентабельностью своих статей и пишите еще!
Вообще лучше было бы внятно объяснить алгоритм на словах и формулами, обосновать, почему это стоит применять собственно к рейтингу и в конце уже привести исходный код,… желательно красивый исходный код, к примеру, как в комментарии выше.
Статья мне не понравилась, но тема очень интересна, не хватает таких материалов, так что, уважаемый автор, работайте над презентабельностью своих статей и пишите еще!
>> Я один не могу проследить логическую связь между рейтингом и гипотенузой?
C статьи:
Почему был избран именно треугольник?
Дело в том что высота треугольника может соответствовать рейтингу пользователя который ставит оценку.
Длинна треугольнка рейтингу которому ставят оценку. А гипотенуза как раз та разнице между авторитетами пользователей.
C статьи:
Почему был избран именно треугольник?
Дело в том что высота треугольника может соответствовать рейтингу пользователя который ставит оценку.
Длинна треугольнка рейтингу которому ставят оценку. А гипотенуза как раз та разнице между авторитетами пользователей.
Может я конечно жирафлю, но разница между авторитетами пользователей это |a-b|, а гипотенуза равна корню суммы квадратов длины катетов и я все еще не могу узреть никакой связи между этими вещами
Нарисуйте треугольник.
Прочитайте внимательно мое сообщение.
Подпишите высоту как userA
длину как userB
Гипотенуза будет длиннее высоты и длинны.
т.е. после того как мы поделим гипотенузу на рейтинг userB
мы получим оценку.
Вот будет реальный пример:
Далее будет код с синтаксическими ошибка, но для наглядности он будет лучше
$a = 254; // Рейтинг пользователя голосующего
$b = 47; // Рейтинг пользователя получающего голос
$aInSquare = ($a * 2) * ($a * 2) = (254*2) + (254*2) = 258064; // Квадрат стороны userA * 2
/* Почему умножаем еще на 2? Методом научного тыка, я обнаружил что результат будет более адекватен */
$bInSquare = $b * $b = 47*47 = 2209; // Квадрат стороны userB
$c = sqrt($bInSquare + $aInSquare) = корень квадратный(258064 + 2209) = 510.16957964975;
$result = (int) round($c / $b) = округлим( 510.16957964975 / 47 = 10.854671… ); // Вот и получится 11, это просто число. Корректирующие условия я не привожу тут.
мы просто поделили userA * 2 на userB
Но если мы будем юзать формулу $result = $a * 2 / $b; то когда $a будет меньше $b более чем в 2 раза, то будут не правильные для нас результаты.
К примеру теперь
$a = 47
$b = 254
то
как мне помнится то округляется в большую сторону после 0,4
в данном случае результат будет равен 0.
Гипотенуза действует как защита от не корректных результатов.
если
$a * 2 / $b = 254 * 2 / 47 = 10,80… // как в нашем условии результаты очень схожи пока $a больше $b но иначе получается
$a * 2 / $b = 47 * 2 / 254 = 0.37…
В случае с гипотенузой менее 1 мы получить не сможем.
Прочитайте внимательно мое сообщение.
Подпишите высоту как userA
длину как userB
Гипотенуза будет длиннее высоты и длинны.
т.е. после того как мы поделим гипотенузу на рейтинг userB
мы получим оценку.
Вот будет реальный пример:
Далее будет код с синтаксическими ошибка, но для наглядности он будет лучше
$a = 254; // Рейтинг пользователя голосующего
$b = 47; // Рейтинг пользователя получающего голос
$aInSquare = ($a * 2) * ($a * 2) = (254*2) + (254*2) = 258064; // Квадрат стороны userA * 2
/* Почему умножаем еще на 2? Методом научного тыка, я обнаружил что результат будет более адекватен */
$bInSquare = $b * $b = 47*47 = 2209; // Квадрат стороны userB
$c = sqrt($bInSquare + $aInSquare) = корень квадратный(258064 + 2209) = 510.16957964975;
$result = (int) round($c / $b) = округлим( 510.16957964975 / 47 = 10.854671… ); // Вот и получится 11, это просто число. Корректирующие условия я не привожу тут.
мы просто поделили userA * 2 на userB
Но если мы будем юзать формулу $result = $a * 2 / $b; то когда $a будет меньше $b более чем в 2 раза, то будут не правильные для нас результаты.
К примеру теперь
$a = 47
$b = 254
то
как мне помнится то округляется в большую сторону после 0,4
в данном случае результат будет равен 0.
Гипотенуза действует как защита от не корректных результатов.
если
$a * 2 / $b = 254 * 2 / 47 = 10,80… // как в нашем условии результаты очень схожи пока $a больше $b но иначе получается
$a * 2 / $b = 47 * 2 / 254 = 0.37…
В случае с гипотенузой менее 1 мы получить не сможем.
Немного по теме, но вот интересная статья про рейтинги типа «TOP Users» и т.д.:
www.evanmiller.org/how-not-to-sort-by-average-rating.html
www.evanmiller.org/how-not-to-sort-by-average-rating.html
формула вынесла мозг. но с идеей статьи согласен.
Очень интересная формула приведена в статье, жаль только в русскоязычных интернетах не удалось накопать больше информации об этом Wilson score interval, чтобы разобраться, почему эта формула выглядит именно так… прискорбно, но математическая литература на английском для меня пока слегка тяжеловата, чтобы я читал ее с удовольствием на правах хобби )
именно какую-то такую формулу с мат. выводом я ожидал увидеть в статье под таким заголовком :)
Не стоит забывать про такую штуку как «инфляция кармы»
это когда расчет идёт в процентах. Например, если все юзеры начинают с 10 кармы, и по умолчанию добавляют 10% от своей кармы кому-то. Постепенно кама увеличивается, появляются юзеры с 100 кармы, которые выдают по 10 единиц сразу, а потом всё больше и больше.
это когда расчет идёт в процентах. Например, если все юзеры начинают с 10 кармы, и по умолчанию добавляют 10% от своей кармы кому-то. Постепенно кама увеличивается, появляются юзеры с 100 кармы, которые выдают по 10 единиц сразу, а потом всё больше и больше.
Из того, как вы описали «гиперболу» (при чем там гипербола?), получается, что:
— Никакой пост не может превысить оценку в 100 баллов
— Пост с миллионом голосов ЗА и пятью голосами ПРОТИВ будет иметь вес в… 3 балла.
— Никакой пост не может превысить оценку в 100 баллов
— Пост с миллионом голосов ЗА и пятью голосами ПРОТИВ будет иметь вес в… 3 балла.
Если в кратце описать, мы делали так, что у нас система учитывала:
— если плюсуешь друга, вес голоса спадает.
— если плюсуешь опять же друга, но постоянно во всех постах, то со временем не учитывается твой голос совершенно.
— если пост плюсует приблизительно один и тот же контенгент, то от этого контенгента оценка так же минимальна.
были еще какие-то плюшки в алгоритме, но мы просто ;*?№"* его писать и придумывать. До сих пор пашет в одном интересном проекте.
И да… мы боролись с кармодрочерством. Вот как-то так.
— если плюсуешь друга, вес голоса спадает.
— если плюсуешь опять же друга, но постоянно во всех постах, то со временем не учитывается твой голос совершенно.
— если пост плюсует приблизительно один и тот же контенгент, то от этого контенгента оценка так же минимальна.
были еще какие-то плюшки в алгоритме, но мы просто ;*?№"* его писать и придумывать. До сих пор пашет в одном интересном проекте.
И да… мы боролись с кармодрочерством. Вот как-то так.
Спасибо за статью!
Полезно.
Именно про Вашу статью я спрашивал в «q&a» «Как материалы из „Песочницы“ добавить в Избранное?», а кармы для приглашения не хватало.
Теперь можно просто добавить в избранное :)
Полезно.
Именно про Вашу статью я спрашивал в «q&a» «Как материалы из „Песочницы“ добавить в Избранное?», а кармы для приглашения не хватало.
Теперь можно просто добавить в избранное :)
Спасибо, буду использовать в последующих проектах.
Простите за занудство, но «нестандартный» в данном случае пишется слитно.
Мне, как владельцу форума, не нравятся системы рейтинга, в которых происходит значительное увеличение общей кармы форума и соответственно его инфляция. Если после введения такой формулы чувак с 50 баллами будет — мегакрутой гуру, то через год-два школьник накрутит эти 50 баллов за день. Кроме того, репообмены и реповойны — крайне грустные вещи. Я себе сделал другую систему. Без репообмена и реповойн.
Любая система рейтинга юзер -> юзер, всегда будет с инфляцией.
Главное не допустить гиперинфляции
А если темпы будут не более 1-3% в день, то это еще допустимо.
Можно какой-то N- период уменьшат карму пользователе в процентах (чтоб не было обделенных).
Подобная система может регулироваться финансовыми принципами.
Главное не допустить гиперинфляции
А если темпы будут не более 1-3% в день, то это еще допустимо.
Можно какой-то N- период уменьшат карму пользователе в процентах (чтоб не было обделенных).
Подобная система может регулироваться финансовыми принципами.
Финансовые принципы — это прекрасно. Именно поэтому я сделал так, что при выставлении балла кому-то у пользователя этот балл вычитается. Это приводит к тому, что никто не шлёпает просто так, а пользуется с большой осторожностью :) Репутация имеет ценность.
Поддерживаю. Аналогично стоит + — и при голосе у человека вычитываеться + и передаеться другому. Никакой инфляции. Но проблема в том что пользователи не одобряют…
В таком случае нужно передавать на 100%, а только часть. от 10% до 50%
Остальные надстройки идут под ваш вкус.
Но лучше всего это время проведенное на форуме. Сторожила и в Африке сторожила.
Будет время подумаю что-то с этим.
Остальные надстройки идут под ваш вкус.
Но лучше всего это время проведенное на форуме. Сторожила и в Африке сторожила.
Будет время подумаю что-то с этим.
ну, причёсывание пользователей — ваша задача. Что значит недовольны? :) В правилах прописано. Не хочешь тратить — не ставь. Точно как деньги. Даже монетизировать можно как-то.
Так подождите, а как происходит ввод новых поинтов в систему? Или каждому новичку на старте даётся базис и на форуме крутится константа поинтов?
Тема очень интересная! Но более интересует формула которая так же зависит и от активности на сайте/форуме что бы избежат накрутчиков.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Алгоритм популярности пользователя на сайте — «Нестандартный подход к стандартным вещам»