我有一个系统,人们可以对一个项目投赞成票或反对票,我想将结果显示为 5 星评级。
我一直在尝试使用此处和此处解释的贝叶斯评级算法,但没有成功。
例如:我的数据库中有三个项目(A、B 和 C):
A = 500 UP 和 500 反对票 B = 0 UP 和 1000 反对票 C = 0 UP 和 1000 反对票
我如何计算每个项目的贝叶斯平均评分,使其得分为 1 到 5?
这篇博文How Not To Sort By Average Rating准确地描述了您的情况,以及如何使用威尔逊分数置信区间来解决它。Reddit使用这个效果很好。
简单代数:
AvgVotes = 所有投票的总和/所有项目的总和
AvgRating = 所有项目的投票总和 * 5 / 所有投票的总和
CurVotes = 当前项目的投票数
CurRating = 当前项目的投票总和 * 5/ 当前项目的投票数
TotalVotes = 所有投票的总和 + 当前项目的投票总和
((AvgVotes * AvgRating) + (CurVotes * CurRating)) * 5 / TotalVotes
所以插入你的数字来评估A的重量......
平均投票数 = 1000
AvgRating = 0(记住不要在此计算中包含您正在评估的项目的数字)
CurVotes = 1000
CurRating = 500 * 5 / 1000 = 2.5
总票数 = 2000 + 1000 = 3000
((1000 * 0) + (1000 * 2.5)) * 5 / 3000 = 4.166
我忘了补充,不要在任何计算或总和中包含任何没有投票的项目,否则它会失去权重。
编辑 - 简化解决方案:
我应该注意到,可以执行该问题的简化解决方案。我只演示了理解的速记形式。压缩算法如下所示:
定义:
SET = 与当前评估目标无关且投票数大于零的任何内容。
TARGET = 您当前尝试评估的元素
25*(((SET up-votes)/(Sum of SET items)) + (Sum of TARGET up-votes)) / (Sum of TARGET votes + Sum of SET votes)
再次插入您的评估“A”的数字以进行澄清和证明:
(25*((0/2)+500)) / (1000+2000) = 4.166