Как стать автором
Обновить

Комментарии 56

Спасибо, заставили задуматься. Ваш способ кажется достаточно интересным. Попытаюсь просимулировать на текущей базе пользователей своего проекта.
Рейтинг голосующего равен нулю и получаем fatal error
А вообще идея интересная
Идея то не новая — здесь закладывается принцип экспертных оценок по рангам и опыту. Только пока ранги и опыт сомнительны и попахивают дедовщиной.
я имел в виду саму реализацию этого принципа — интуитивно чувствуется, что +- не должен быть единицей, но вот «физической» реализации принципа не встречал.
При умножении 0 ничего страшного не происходит. Он все равно передает вес в 1н бал.
Протестируйте прям с этого примера.

только выберите для вас угодный:
$a = 0;
$b = rand(0,5000);

сорри, пропустил if($b<=0){ $b=1; }
точно, и я пропустил. вообще, если бы автор подсветил код с помощью:
<source lang="php">
// code is here
</source>

то не было бы таких незамеченых вещей
допустим, рейтинг пользователя получающего голос $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 }
Здравый смысл говорит одно, но интерпретатор совершенно другое.
PHP 5.2
Простите, я сам протупил.
if($b <= 0){ $b = 1; }
=))) вот потому надо было подсветить код
У вас учитывается голый результат голосовалки пользователей. В оценки материала или того же пользователя стоит обращать еще внимание на качество источника оценки. Если это дискуссионные форумы — то в расчет можно брать:
а) Активность в том или ином разделе с оценкой его активности и качества информации другими пользователями
б) Опыт (срок пребывания) с учетом частоты посещения
в) Оценка полезности (если ресурс с адекватными личностями — то может быть рассчитан)
г) Законопослушность и чистоту аккаунта
д) другие характеристики.

Голая цифра плюсов или минусов не защищает алгоритм от фобов. А вот они массой могут любую статистику поломать фанатично гонясь за самоутвержденного идола.

И все-таки — это имхо, которым может быть можно было бы дополнить ваши изыскания =)
кстати, автор — СИшник?
откуда такое обилие depracated "#" и "/**/" в коде для комментариев вместо "//"? )
Это привычка комментариев крупных кусков и выделений важных элементов.
depracated "#" и "/**/"


Кхм… Пруфом не поделитесь?
Написано Comments starting with '#' are now deprecated in .INI files. (http://php.net/manual/en/migration53.deprecated.php)

Я был бы признателен, если бы кто-то прояснил ситуацию, причем здесь .INI файлы
Я имел ввиду depracated "#", но не "/**/"

Но пруф что-то не нашел. Возможно, что перепутал. Единственное, что нашел
Опции php.ini
Так же в конфигурационном файле теперь нельзя использовать Си-комментарии, то есть комментарии, начинающиеся с символа '#

Возможно, из-за этого и перепутал. Но, имхо, // менее шумно, чем #
Про .ini я видел в ченжлоге, а вот про .php — нет. Скорее всего, Вы перепутали.
скорее всего так. забираю слова про deprecated.
Я извиняюсь, но 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. а если наоборот? а если минусуют человека в глубоком минусе? и т.д.
Если взять пример моего кода, то вы получаете результат.

Это число 11. А отнять или добавить, это дело ваше и 1й строчки.
Лучше скопируйте и вставьте его на какой-то тестовый сайт ваш (я специально держу на виртуалке спец. сайт)

>> если минусуют человека в глубоком минусе?

если у пользователя 0 и меньше, то снимается исключительно по 1 баллу.
Ну я обычно делаю так:
shock@localhost:~> php test.php

Теперь понял. Согласен.
В топике не хватает десятка примеров, чтобы сходу оценить работу алгоритма.
Проблема в том, что нужно привести не менее сотни примеров.
начиная от
negative->negative
negative->positive
positive->positive
и так далее + сильный разброс чисел.

Это нужно это видеть глазами чтоб почувствовать действие.

Простите за плохое оформление темы =(
Следующую статья я оформлю более интересно.
ну хотя бы штук десять можно написать, чтобы понять суть.
и еще совет — используйте <h2> для заголовков.
ничего страшного. мы ведь вас не хаим, а советуем, обсуждаем.
Я один не могу проследить логическую связь между рейтингом и гипотенузой?

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

Статья мне не понравилась, но тема очень интересна, не хватает таких материалов, так что, уважаемый автор, работайте над презентабельностью своих статей и пишите еще!
>> Я один не могу проследить логическую связь между рейтингом и гипотенузой?

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 мы получить не сможем.
формула вынесла мозг. но с идеей статьи согласен.
Очень интересная формула приведена в статье, жаль только в русскоязычных интернетах не удалось накопать больше информации об этом Wilson score interval, чтобы разобраться, почему эта формула выглядит именно так… прискорбно, но математическая литература на английском для меня пока слегка тяжеловата, чтобы я читал ее с удовольствием на правах хобби )
именно какую-то такую формулу с мат. выводом я ожидал увидеть в статье под таким заголовком :)
Не стоит забывать про такую штуку как «инфляция кармы»

это когда расчет идёт в процентах. Например, если все юзеры начинают с 10 кармы, и по умолчанию добавляют 10% от своей кармы кому-то. Постепенно кама увеличивается, появляются юзеры с 100 кармы, которые выдают по 10 единиц сразу, а потом всё больше и больше.
Как и любая денежная система.
Но будут пользователи банится и минусоваться, что в свою очередь будет сдерживать карму от сильнейшего наплыва.

Идеальной системы не существует.
Под каждый проект идут свои надстройки.
Из того, как вы описали «гиперболу» (при чем там гипербола?), получается, что:

— Никакой пост не может превысить оценку в 100 баллов
— Пост с миллионом голосов ЗА и пятью голосами ПРОТИВ будет иметь вес в… 3 балла.

Если в кратце описать, мы делали так, что у нас система учитывала:

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

были еще какие-то плюшки в алгоритме, но мы просто ;*?№"* его писать и придумывать. До сих пор пашет в одном интересном проекте.

И да… мы боролись с кармодрочерством. Вот как-то так.
Спасибо, буду использовать в последующих проектах.
Простите за занудство, но «нестандартный» в данном случае пишется слитно.
Мне, как владельцу форума, не нравятся системы рейтинга, в которых происходит значительное увеличение общей кармы форума и соответственно его инфляция. Если после введения такой формулы чувак с 50 баллами будет — мегакрутой гуру, то через год-два школьник накрутит эти 50 баллов за день. Кроме того, репообмены и реповойны — крайне грустные вещи. Я себе сделал другую систему. Без репообмена и реповойн.
Любая система рейтинга юзер -> юзер, всегда будет с инфляцией.
Главное не допустить гиперинфляции

А если темпы будут не более 1-3% в день, то это еще допустимо.

Можно какой-то N- период уменьшат карму пользователе в процентах (чтоб не было обделенных).

Подобная система может регулироваться финансовыми принципами.
Финансовые принципы — это прекрасно. Именно поэтому я сделал так, что при выставлении балла кому-то у пользователя этот балл вычитается. Это приводит к тому, что никто не шлёпает просто так, а пользуется с большой осторожностью :) Репутация имеет ценность.
Поддерживаю. Аналогично стоит + — и при голосе у человека вычитываеться + и передаеться другому. Никакой инфляции. Но проблема в том что пользователи не одобряют…
В таком случае нужно передавать на 100%, а только часть. от 10% до 50%

Остальные надстройки идут под ваш вкус.

Но лучше всего это время проведенное на форуме. Сторожила и в Африке сторожила.
Будет время подумаю что-то с этим.
ну, причёсывание пользователей — ваша задача. Что значит недовольны? :) В правилах прописано. Не хочешь тратить — не ставь. Точно как деньги. Даже монетизировать можно как-то.
Так подождите, а как происходит ввод новых поинтов в систему? Или каждому новичку на старте даётся базис и на форуме крутится константа поинтов?
баллы даются за полезные для коммъюнити вещи — добавления статей, организацию оффлайновых мероприятий…
Тема очень интересная! Но более интересует формула которая так же зависит и от активности на сайте/форуме что бы избежат накрутчиков.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории