如何为二进制评级系统实现贝叶斯平均算法

Posted

技术标签:

【中文标题】如何为二进制评级系统实现贝叶斯平均算法【英文标题】:How to implement the Bayesian average algorithm for a binary rating system 【发布时间】:2011-03-10 16:10:46 【问题描述】:

我有一个系统,人们可以对某个项目投赞成票或反对票,我想将结果显示为 5 星评级。

我一直在尝试使用 here 和 here 解释的贝叶斯评级算法,但没有成功。

例如:我的数据库中有三个项目(A、B 和 C):

A = 500 赞成票和 500 反对票 B = 0 UP 和 1000 反对票 C = 0 赞成票和 1000 票反对票

我如何计算每个项目的贝叶斯平均评分,使其得分为 1 到 5?

【问题讨论】:

What is the best algorithm to calculate the most scored item?的可能重复 【参考方案1】:

简单代数:

AvgVotes = 所有投票的总和/所有项目的总和

AvgRating = 所有项目的投票总和 * 5 / 所有投票的总和

CurVotes = 当前项目的投票数

CurRating = 当前项目的投票总数 * 5/ 当前项目的投票数

TotalVotes = 所有投票的总和 + 当前项目的投票总和

((AvgVotes * AvgRating) + (CurVotes * CurRating)) * 5 / TotalVotes

所以插入你的数字来评估 A 的权重...

平均投票数 = 1000

AvgRating = 0(请记住不要在此计算中包含您正在评估的项目的数字)

CurVotes = 1000

当前评分 = 500 * 5 / 1000 = 2.5

总票数 = 2000 + 1000 = 3000

((1000 * 0) + (1000 * 2.5)) * 5 / 3000 = 4.166

我忘了补充,不要在任何计算或总和中包含任何没有投票的项目,否则会导致权重下降。

编辑 - 简化解决方案:

我应该注意到,可以执行该问题的简化解决方案。我只演示了理解的速记形式。压缩后的算法如下:

定义:

SET = 与当前评估目标无关且投票数大于零的任何内容。

TARGET = 您当前尝试评估的元素

25*(((SET 投票总和)/(SET 项目总和)) + (TARGET 投票总和)) / (TARGET 投票总和 + SET 投票总和)

再次插入您评估“A”的数字以进行澄清和证明:

(25*((0/2)+500)) / (1000+2000) = 4.166

【讨论】:

为了方便阅读,我将我的评论移到了我编辑过的帖子中。【参考方案2】:

这篇博文How Not To Sort By Average Rating 准确描述了您的情况,以及如何使用Wilson Score confidence interval 解决它。 Reddit used this 效果不错。

【讨论】:

为了节省其他人的时间,这不适用于 5 星评级,仅适用于正面/负面评级。

以上是关于如何为二进制评级系统实现贝叶斯平均算法的主要内容,如果未能解决你的问题,请参考以下文章

PHP 贝叶斯评级 - 加权投票评级系统

推荐系统笔记:基于贝叶斯的协同过滤

在 MATLAB 中实现朴素贝叶斯算法 - 需要一些指导

如何用 Java 利用贝叶斯算法实现垃圾邮件过滤

python朴素贝叶斯分类MNIST数据集

python 熊猫贝叶斯评级