[algorithm] 별 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


답변

더 좋은 방법은

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

끝난!


답변

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


답변

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

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


답변

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