在喜欢/不喜欢投票系统方面需要帮助

Posted

技术标签:

【中文标题】在喜欢/不喜欢投票系统方面需要帮助【英文标题】:Need help on like/dislike voting system 【发布时间】:2011-09-29 04:04:12 【问题描述】:

我想获得一些帮助来构建一个喜欢/不喜欢排序算法来找到最佳条目。我想了一个办法,但是这种方法有两个主要缺陷,我想知道是否有更好的方法。

这是我的想法:

这些条目将按照l/d 给出的比率排序,其中l = number of likesd = number of dislikes,因此比率较高的人的点赞数比比率低的人更高。

这个方法有两个问题:

1:如果不喜欢的次数为 0,l/d 将是不可能的。因此,即使一个条目有 1000 个喜欢和 0 个不喜欢,它仍然不会进入记分板。

2:喜欢和不喜欢的条目与评分多的条目相比具有优势,因为它需要少量的评分来影响比率并给条目一个好的得分。

你怎么看?

编辑:这是解决第一个问题的可能替代方法:(l + 1) / (d + 1)。对此有何反馈?

【问题讨论】:

+1 因为我确信这是一个非常常见的问题,具有强大的数学/统计答案,但我不知道最好的解决方案。 这里有一些关于 Reddit 的有趣信息:amix.dk/blog/post/19588 @FogleBird the XKCD version 【参考方案1】:

这对我来说效果最好。

rank = likes * 100 / (likes + dislikes)

它按较高的喜欢排序,然后是任何喜欢和/或不喜欢的活动,然后是没有活动。 例子:

likes, dislikes => rank
0, 0 => 0            //avoid /0 error
3, 3 => 50
3, 0 => 100

【讨论】:

【参考方案2】:

这可能是相关的:How Not To Sort By Average Rating。

【讨论】:

【参考方案3】:

要消除除以零,您可以在分子和分母上加 1 以获得 (l+1)/(d+1)。如果您想对更多喜欢的条目进行更高的排名,那么您可以将排名公式乘以 log(喜欢的数量 + 1)。在这里添加一个以消除如果条目有零个赞而导致的数学错误。对于接下来的讨论,假设日志的底数为 10。因此满足要求的排名公式为 (likes + 1)/(dislikes + 1) * log(likes + 1)。

请注意,如果因为 log(1) = 0,没有喜欢,则此公式提供的排名为 0。假设投票与一个喜欢投票和一个不喜欢投票相关联。那么秩是 2/2*log(2) = 0.3,因为 log(2) = 0.3。现在考虑另一个有 9 个喜欢和 9 个不喜欢的关系。那么排名是 10/10*log(10) = 1,因为 log(10) = 1。也就是说,log(likes) 项对喜欢更多的关系的排名高于喜欢更少的关系。

【讨论】:

写完这篇文章后,我注意到您的编辑提供了 (l+1)/(d+1) 修复。 很好,唯一的问题是直觉上你想要的东西有 0 个喜欢和 0 个不喜欢的分数高于 0 个喜欢和 1000 个不喜欢的分数。

以上是关于在喜欢/不喜欢投票系统方面需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MongoDB 建模“点赞”投票系统

如何在不引发错误的情况下更新数据库中的不喜欢投票?

Rails 3:阻止用户对自己的内容进行投票

在 javascript 中发布喜欢/不喜欢系统 php

投票 | 你工作中最常用的编程语言与喜欢看哪些内容

MySQL查询优化:如何优化投票计算?