做产品评测(Product Review Website)网站时会遇到如何对产品进行智能排序(smarting ranking or smarting rating)的问题。

假设有10款同类型不同品牌的电风扇,网站允许登录用户对这些产品进行评论和打分,为了让其他用户更快了解哪些产品是大多数用户认同的产品,哪些是不好用的产品,就要根据用户打分情况给产品排个序,让结果一目了然。

在亚马逊购物时,如果你要买一本php的书籍,书A 3人打分,平均分5.0;书B 10个人打分,平均分4.8;书C 50人打分,平均分只有4.5,你将如何选择?如果按照平均分排序,书A是最佳选择。

平时我们都有一种感觉,很多人去买,这个东西就更可信,只有一两个人说好,可能是托。所以我们需要借助众人的智慧,也就是说越多人打分,这个产品的评分就越可信,就应当获得更高的权重,这就是我们今天要说的综合打分人数和平均分的产品排序方法。

贝叶斯理论(Bayes’ theorem)可以理解为一个理想情况下的理智的人如何对一个结果的可信度给出答案。而贝叶斯平均值( Bayesian average)就是根据贝叶斯理论给出的一种计算平均值的方法。贝叶斯平均值公式如下:

C是一个常量,与数据集的大小成正比
m是数据集的算术平均值
n是数据集的总数

为每个产品计算贝叶斯平均值并以此作为排序的依据,我们有下面这个公式

BA = ((AvgNumOfRatingsForAll * AvgRatingForAll) + TotalRating) / (RateCount + AvgNumOfRatingsForAll)

两个在计算过程中不变的值

AvgNumOfRatingsForAll – 所有列出的产品打分次数的平均值
AvgRatingForAll – 所有列出产品的分数平均值

两个针对某个产品的值

TotalRating – 某产品所有评分的总和
RateCount – 某产品所有评论数的总和

以书ABC为一个数据集合为例。

AvgNumOfRatingsForAll = 21
AvgRatingForAll = 4.571 

书名打分次数平均打分TotalRating贝叶斯平均
A35.0154.625
B104.8484.645
C504.52254.521

计算结果表明虽然书A拥有最高平均分,但结合打分次数后书B是最佳选择。

常数C越大,则给予打分次数的权重越高。假设产品添加的频率不高,在其他产品已经有很多打分次数的情况下新产品被添加,会被排的很靠后,为了保持公平,可以适当降低C,假设是0.75,则公式变为:

BA = ((AvgNumOfRatingsForAll * 0.75 * AvgRatingForAll) + TotalRating) / (RateCount + (AvgNumOfRatingsForAll * 0.75))

根据此公式的计算结果为

书名打分次数平均打分TotalRatingC=0.75的贝叶斯平均
A35.0154.640
B104.8484.660
C504.52254.517

比较发现打分次数较少的产品贝叶斯均值有所提升,打分次数较多的则稍有下降

结论:以贝叶斯平均为依据的排序更能反应真实的情况,打分次数多且评分较高的产品会更加靠前,打分次数多评分较低的产品也会更加靠后,与单纯依据每个产品的平均分排序相比,这种结果更有意义。