我正在使用威尔逊计分算法(代码如下),并意识到它不考虑反对票。
例子:
Upvotes Downvotes Score
1 0 0.2070
0 0 0
0 1 0 <--- this is wrong
这是不正确的,因为负的净选票应该有一个较低的分数。
def calculate_wilson_score(up_votes, down_votes)
require 'cmath'
total_votes = up_votes + down_votes
return 0 if total_votes == 0
z = 1.96
positive_ratio = (1.0*up_votes)/total_votes
score = (positive_ratio + z*z/(2*total_votes) - z * CMath.sqrt((positive_ratio*(1-positive_ratio)+z*z/(4*total_votes))/total_votes))/(1+z*z/total_votes)
score.round(3)
end
更新:
以下是对维基百科上Wilson scoring confidence interval的描述。
最佳答案
威尔逊得分较低的置信区间张贴肯定会考虑到反对票,虽然较低的置信区间不会得到低于零,这是完全可以的。排序项目的这种近似通常用于确定最佳评级列表上的最高排名项目。因此,当查看排名最低的项(您正在描述的类型)时,它可能具有不需要的属性。
这种项目排序方法在evan miller的a post on how not to sort by average rating中得到了推广,尽管他后来stated
我之前提出的解决方案——使用平均值周围置信区间的下限——就是计算机程序员所说的黑客它之所以起作用,并不是因为它是一个普遍最优的解决方案,而是因为它大体上符合我们的直觉,即我们希望在一个最佳评级列表的顶部看到的东西:给定数据,坏概率最小的项目。
如果你真的对分析列表中排名最低的项目感兴趣,我建议要么使用置信上限,要么使用贝叶斯评分系统,如:https://stackoverflow.com/a/30111531/3884938