问题定义:
最受用户好评的作品/产品(同时需要有正面和负面两种反馈)
两种常见的错误算法是:
得分 = 赞成票 - 反对票
得分 = 赞成票 / 总票数
显然,前者显著倾向大样本,后者在小样本下极不稳定。
如何在样本数差异较大的情况下合理地获得用户评分呢?
首先做如下设定:
(1)每个用户的投票都是独立事件。
(2)用户只有两个选择,要么投赞成票,要么投反对票。
(3)如果投票总人数为n,其中赞成票为k,那么赞成票的比例p就等于k/n。
我们的思路是,p越大,就代表这个项目的好评比例越高,越应该排在前面。但是,p的可信性,取决于有多少人投票,如果样本太小,p就不可信。好在我们已经知道,p是"二项分布"中某个事件的发生概率,因此我们可以计算出p的置信区间。所谓["置信区间"],就是说,以某个概率而言,p会落在的那个区间。比如,某个产品的好评率是80%,但是这个值不一定可信。根据统计学,我们只能说,有95%的把握可以断定,好评率在75%到85%之间,即置信区间是[75%, 85%]。
这样一来,排名算法就比较清晰了:
(1)计算每个项目的"好评率"(即赞成票的比例)。
(2)计算每个"好评率"的置信区间(以95%的概率)。
(3)根据置信区间的下限值,进行排名。这个值越大,排名就越高。
置信区间的实质,就是进行可信度的修正,弥补样本量过小的影响。如果样本多,就说明比较可信,不需要很大的修正,所以置信区间会比较窄,下限值会比较大;如果样本少,就说明不一定可信,必须进行较大的修正,所以置信区间会比较宽,下限值会比较小。
二项分布的置信区间有多种计算公式,最常见的是["正态区间"],教科书里几乎都是这种方法。但是,它只适用于样本较多的情况(np > 5 且 n(1 − p) > 5),对于小样本,它的准确性很差。于是我们采用威尔逊区间:
def ci_lower_bound(pos, n, confidence)
if n == 0
return 0
end
z = 1.96
phat = 1.0 * pos / n
(phat + z * z/(2 * n) - z * math.sqrt((phat * (1 - phat) + z * z/(4 * n)) / n))/(1 + z * z / n)
end
其中,pos是好评率,n是评论总数,confidence表示置信度,z则是该置信度下的z值(0.95置信度下z值为1.96)
但还是有问题,如果使用"威尔逊区间",小样本的得分将被大幅拉低,这样处理是否公平,能不能反映它们真正的质量?
于是有了贝叶斯平均,其核心是为冷门题目提供一个补偿值使其不至于因为少量评价而产生不可靠的评分,而在评价数量多后减小补偿值的比例,最终使得随着评价数量的增加而评分逐渐逼近实际值。
评分公式如下:
贝叶斯平均
其中,C是补偿评价数(平均评价数),M是补偿评分(平均评分),n是评价数量,s是已计算评分。通常C、M应为常量,使最终评分只与评价数量和已计算评分相关。
总之,叠加威尔逊区间与贝叶斯平均,可以将用户的两种反馈(如果只有一个评分可以直接使用贝叶斯平均)量化成最终的评分,最大程度上平衡样本数量差异的影响。
网友评论