用于计算5星评级的算法

use*_*438 61 algorithm weighted-average rating-system

我需要计算亚马逊网站上的五星评级.我已经做了足够的搜索来找到最好的算法,但我无法得到正确的答案.例如,如果这些是评级

5 star - 252
4 star - 124
3 star - 40
2 star - 29
1 star - 33
Run Code Online (Sandbox Code Playgroud)

共478条评论

亚马逊计算出这是"4.1星,5星".谁能告诉我这个数字是如何得出的?我只是通过平均而无法做到这一点.

Bli*_*ndy 141

这是一个加权平均值,您可以将每个评级与其获得的投票数量进行权衡:

(5*252 + 4*124 + 3*40 + 2*29 + 1*33) / (252+124+40+29+33) = 4.11 and change
Run Code Online (Sandbox Code Playgroud)

  • +1表示其加权平均值的事实 (16认同)
  • 这与"常规"平均值有什么不同? (9认同)
  • 它与常规平均值相同 (2认同)
  • 是的,它与常规平均值相同。我们将(添加总星星数)除以总用户数。它看起来像分子乘法的加权 coz。但如果我们改写它,我们基本上会添加所有 5、所有 4 等。因为 5 是 252 次,所以最终会变成 5*252,依此类推。 (2认同)

小智 11

如果您从头开始计算总体评级,那么此公式将对您有所帮助.

((Overall Rating * Total Rating) + new Rating) / (Total Rating + 1)
Run Code Online (Sandbox Code Playgroud)

假设你到目前为止没有评级,那么公式就像,到目前为止整体评价为"0".总评分"0",给定评级为"4"

((0*0)+4)/1 = 4
Run Code Online (Sandbox Code Playgroud)

如果总体评分是"4.11"总评分是"478"并且由一个用户给出的新评级是"2"

然后公式就好

((4.11 * 478)+ 2)/479 // 479 is increment of new rating from 478
Run Code Online (Sandbox Code Playgroud)


Asa*_*sad 11

一个更好的方法来做到这一点,

rating = (sum_of_rating * 5)/sum_of_max_rating_of_user_count  
Run Code Online (Sandbox Code Playgroud)

例子:

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

rating = (25 * 5) / 30
Run Code Online (Sandbox Code Playgroud)

完毕!


Jef*_*eff 10

在evanmiller.org上有一篇非常好的关于这个主题的文章.他介绍并讨论了一些方法的优缺点,并提出了一种数学上可靠的加权和计算投票方式.

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

  • 更妙的是,他现在写了另一篇关于星级的文章:http://www.evanmiller.org/ranking-items-with-star-ratings.html (5认同)

gar*_*tor 8

是的,你可以将它们平均化:

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


Rob*_*air 6

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;
}
Run Code Online (Sandbox Code Playgroud)

如何构建上面的$ ratings数组

示例伪代码,但是假设您有一个名为“ ratings”的表和名为“ rating”的列,则该伪代码应能解释在数据库中存储信息时如何构建$ 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
Run Code Online (Sandbox Code Playgroud)

评论中建议的另一种方法

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
Run Code Online (Sandbox Code Playgroud)