Наводнение байесовского рейтинга создает значения вне диапазона - PullRequest
2 голосов
/ 16 мая 2011

Я пытаюсь применить формулу байесовского рейтинга , но если я оцениваю 1 из 5 тысяч сотен, окончательный рейтинг будет больше 5.

Например,данный элемент не имеет голосов и после голосования 170 000 раз с 1 звездой, его окончательный рейтинг составляет 5,23.Если я оцениваю 100, оно имеет нормальное значение.

Вот что я имею в PHP.

<?php
// these values came from DB
$total_votes     = 2936;    // total of votes for all items
$total_rating    = 582.955; // sum of all ratings
$total_items     = 202;

// now the specific item, it has no votes yet
$this_num_votes  = 0;
$this_score      = 0;
$this_rating     = 0;

// simulating a lot of votes with 1 star
for ($i=0; $i < 170000; $i++) { 
    $rating_sent = 1; // the new rating, always 1

    $total_votes++; // adding 1 to total
    $total_rating = $total_rating+$rating_sent; // adding 1 to total

    $avg_num_votes = ($total_votes/$total_items); // Average number of votes in all items
    $avg_rating = ($total_rating/$total_items);   // Average rating for all items
    $this_num_votes = $this_num_votes+1;          // Number of votes for this item
    $this_score = $this_score+$rating_sent;       // Sum of all votes for this item
    $this_rating = $this_score/$this_num_votes;   // Rating for this item

    $bayesian_rating = ( ($avg_num_votes * $avg_rating) + ($this_num_votes * $this_rating) ) / ($avg_num_votes + $this_num_votes);
}
echo $bayesian_rating;
?>

Даже если я заливаю 1 или 2:

$rating_sent = rand(1,2)

Итоговая оценка после 100 000 голосов превышает 5.

Я только что провел новый тест, используя

$rating_sent = rand(1,5)

И после 100 000 я получил значение полностью вне диапазона (10,53).Я знаю, что в обычной ситуации ни один из пунктов не получит 170 000 голосов, в то время как все остальные не получат голоса.Но мне интересно, если что-то не так с моим кодом или это ожидаемое поведение байесовской формулы с учетом массовых голосов.

Редактировать

Просто чтобы прояснить это, вот лучшее объяснение некоторых переменных.

$avg_num_votes   // SUM(votes given to all items)/COUNT(all items)
$avg_rating      // SUM(rating of all items)/COUNT(all items)
$this_num_votes  // COUNT(votes given for this item)
$this_score      // SUM(rating for this item)
$bayesian_rating // is the formula itself

Формула: ( (avg_num_votes * avg_rating) + (this_num_votes * this_rating) ) / (avg_num_votes + this_num_votes).Взято с здесь

1 Ответ

3 голосов
/ 16 мая 2011

Вам нужно делить на total_votes, а не total_items при расчете avg_rating.

Я внес изменения и получил кое-что, что ведет себя гораздо лучше.

http://codepad.org/gSdrUhZ2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...