development

별 5 개 등급을 계산하는 데 사용되는 알고리즘

big-blog 2020. 12. 6. 21:48
반응형

별 5 개 등급을 계산하는 데 사용되는 알고리즘


아마존 웹 사이트에서와 같이 별 5 개 등급을 계산해야합니다. 최고의 알고리즘을 찾기 위해 충분한 검색을 수행했지만 적절한 답을 얻을 수 없습니다. 예를 들어, 이것이 등급이라면

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

총 478 개 리뷰

아마존은 이것을 "별 5 개 중 4.1 개"로 계산했습니다. 누구든지이 수치가 어떻게 도착했는지 말해 줄 수 있습니까? 나는 평균을함으로써 이것을 얻을 수 없다.


그것은 가중 평균이며, 각 등급을 투표 수로 평가합니다.

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

처음부터 전체 등급 계산을 시작하는 경우이 공식이 도움이 될 것입니다.

공식

((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

evanmiller.org에는이 주제에 대한 훌륭한 글이 있습니다. 그는 몇 가지 접근 방식의 장단점을 검토하고 토론하며 수학적으로 신뢰할 수있는 가중치 부여 및 투표 계산 방법을 제안합니다.

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


예, 평균을 낼 수 있습니다.

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


Blindy의 매우 유용한 답변입니다. 여기에 기반한 PHP 코드가 있습니다. 일부는 유용 할 수 있습니다. 결과는 OP의 예에 따라 4.11입니다.

$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;
}

위의 $ ratings 배열을 만드는 방법

의사 코드의 예이지만 "ratings"라는 테이블과 "rating"이라는 열이 있다고 가정 할 때 정보가 DB에 저장 될 때 $ ratings 배열을 빌드하는 방법을 설명하는 작동해야합니다. 이 경우 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

이 등급 시스템은 가중 평균 또는 가중 평균을 기반으로합니다 . 즉, 그들은 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

가중 평균, 별 수에 가중치를 더한 다음 총 리뷰 수로 나눕니다.


You may want to check this algorithm out: Calculating Average Rating the Right Way using PHP and MySQL - there's no need of saving each "star" (aka rating grade) and its corresponding number of votes and then having to retrieve thousands of rows from the database every time you need to calculate their average. (unless you want to display exactly how many people rated the given item with 1, 2, 3, 4 & 5 stars)


a better way to do this,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  

example:

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

rating = (25 * 5) / 30

Done!


in 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));

(Total nunber of star / total number of persons who review * 5 ) * 5

= Answer

Fixed decimals in js to 1.

answer.toFixed(1);

Example the total reviews of 5 person is 20 star.

(20/5*5)*5 = 4.0

참고URL : https://stackoverflow.com/questions/10196579/algorithm-used-to-calculate-5-star-ratings

반응형