Подтвердить что ты не робот

Алгоритм, используемый для расчета оценок 5 звезд

Мне нужно рассчитать 5-звездочные рейтинги, такие как на сайте Amazon. Я сделал достаточно поиска, чтобы найти лучший алгоритм, но я не могу получить правильный ответ. Например, если это рейтинги

5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33

всего 478 отзывов

Amazon подсчитал, что это "4,1 из 5 звезд". Может кто-нибудь сказать мне, как эта цифра получена? Я не могу получить это, просто делая среднее.

4b9b3361

Ответ 1

Это средневзвешенное значение, когда вы взвешиваете каждый рейтинг с количеством голосов, которое он получил:

(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change

Ответ 2

Если вы начинаете подсчет общего рейтинга с самого начала, то эта формула поможет вам.

формула

((Overall Rating * Total Rating) + new Rating) / (Total Rating + 1)

пример

Предположим, что у вас нет оценок до сих пор, тогда формула похожа, общая оценка до сих пор равна "0". итоговый рейтинг "0" и рейтинг "4"

((0*0)+4)/1 = 4

Если общий рейтинг равен "4.11", общий рейтинг равен "478", а новый пользователь дает оценку "2".

тогда формула как

((4.11 * 478)+ 2)/479 // 479 is increment of new rating from 478

Ответ 3

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

http://evanmiller.org/ranking-items-with-star-ratings.html

Ответ 4

Да, вы можете усреднить их:

(5 * 252 + 4 * 124 + 3 * 40 + 2 * 29 + 1 * 33) / 478 = 4.11

Ответ 5

Очень полезный ответ от Blindy, здесь PHP-код, основанный на нем. Некоторые могут найти полезным. Результаты будут 4,11 в соответствии с примером OP:

$ratings = array(
5 => 252,
4 => 124,
3 => 40,
2 => 29,
1 => 33
);

function calcAverageRating($ratings) {

$totalWeight = 0;
$totalReviews = 0;

foreach ($ratings as $weight => $numberofReviews) {
    $WeightMultipliedByNumber = $weight * $numberofReviews;
    $totalWeight += $WeightMultipliedByNumber;
    $totalReviews += $numberofReviews;
}

//divide the total weight by total number of reviews
$averageRating = $totalWeight / $totalReviews;

return $averageRating;
}

Как создать вышеуказанный массив $ рейтингов

Пример псевдокода, но который должен работать, который объясняет, как построить массив $ рейтинги, когда информация хранится в БД, при условии, что у вас есть таблица с именем "рейтинги" и столбец с именем "рейтинг". В этом случае это 1 присоединение, вам нужно сделать 4 объединения, чтобы получить все рейтинги, но это должно помочь вам начать:

SELECT count(c1.rating) as one_star, count(c2.rating) as two_star  
FROM ratings c1 
LEFT OUTER JOIN
ratings c2
ON
c1.id = c2.id
WHERE
c1.rating = 1
AND
c2.rating = 2

другой подход предлагается в комментариях

SELECT SUM(rating = 1) AS one_s ,SUM(rating = 2) AS two_s ,SUM(rating = 3) as three_s FROM reviews where product_id = 9

Ответ 6

Эта рейтинговая система основана на средневзвешенном значении или средневзвешенном значении. То есть они использовали вес в терминах звезд для вычисления десятичного значения, которое округляется до 4.1. Например:

Sum of (weight * number of reviews at that weight) / total number of reviews
(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / 478 = 4.1

Ответ 7

Средневзвешенное значение, суммируйте количество звезд, умноженное на его вес, и затем разделите его на общее количество обзоров.

Ответ 8

Вы можете проверить этот алгоритм: Вычисление среднего рейтинга с использованием PHP и MySQL - нет необходимости сохранять каждую "звезду" "(оценка рейтинга) и соответствующее количество голосов, а затем необходимо извлекать тысячи строк из базы данных каждый раз, когда вам нужно рассчитать их среднее значение. (если вы не хотите точно отображать, сколько людей оценили данный предмет с помощью 1, 2, 3, 4 и 5 звезд)

Ответ 9

лучший способ сделать это,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  

пример:

total users rated: 6  
sum_of_max_rating_of_user_count: 6 x 5 = 30  
sum_of_rating: 25

rating = (25 * 5) / 30

Готово!

Ответ 10

в JavaScript

calcAverageRating(ratings) {

  let totalWeight = 0;
  let totalReviews = 0;

  ratings.forEach((rating) => {

    const weightMultipliedByNumber = rating.weight * rating.count;
    totalWeight += weightMultipliedByNumber;
    totalReviews += rating.count;
  });

  const averageRating = totalWeight / totalReviews;

  return averageRating.toFixed(2);
}


const ratings = [
  {
    weight: 5,
    count: 252
  },
  {
    weight: 4,
    count: 124
  },
  {
    weight: 3,
    count: 40
  },
  {
    weight: 2,
    count: 29
  },
  {
    weight: 1,
    count: 33
  }
];

console.log(calcAverageRating(ratings));

Ответ 11

(Общее количество звездочек/общее количество людей, просмотревших * 5) * 5

= Ответ

Исправлены десятичные дроби в js до 1.

answer.toFixed(1);

Пример всего отзывов 5 человек 20 звезд.

(20/5 * 5) * 5 = 4,0