阅读How Not To Sort By Average Rating我认为我应该试一试。
CREATE FUNCTION `mydb`.`LowerBoundWilson95` (pos FLOAT, neg FLOAT)
RETURNS FLOAT DETERMINISTIC
RETURN
IF(
pos + neg <= 0,
0,
(
(pos + 1.9208) / (pos + neg)
-
1.96 * SQRT(
(pos * neg) / (pos + neg) + 0.9604
)
/ (pos + neg)
)
/
(
1 + 3.8416
/ (pos + neg)
)
);
运行一些测试,我发现pos=0
和neg>0
的对象的分数非常小但非负分数,而pos=neg=0
的对象得分为零,排名较低
我认为一个未评级的对象应该列在没有正面评级但有一些负面评价的对象之上。
我推断“个人评分都是偏离某些基线的表现,所以我会移动基线,我会给每个对象一个'中性'的初始分数,”所以我想出了这个: / p>
CREATE FUNCTION `mydb`.`AdjustedRating` (pos FLOAT, neg FLOAT)
RETURNS FLOAT DETERMINISTIC
RETURN
(
SELECT `mydb`.`LowerBoundWilson95` (pos+4, neg+4)
);
以下是AdjustedRating
\ pos 0 1 2
neg
0 | 0.215 | 0.188 | 0.168
1 | 0.266 | 0.235 | 0.212
2 | 0.312 | 0.280 | 0.235
这更接近我想要的那种分数,作为一个数字黑客,我猜它是可行的,但我不能在数学上证明它
有更好的方式,“正确”的方式吗?
答案 0 :(得分:2)
问题出现是因为这种近似值(置信下限)实际上是用于识别列表中评分最高的项目。如果你对排名最低的人感兴趣,你可以采取较高的置信度。
或者,我们使用贝叶斯统计量,这是您描述的第二种方法的形式化。 Evan Miller实际上有一个followup post,他说:
我之前提出的解决方案 - 使用平均值周围的置信区间的下限 - 是计算机程序员所说的黑客攻击。它不是因为它是一个普遍最优的解决方案,而是因为它大致对应于我们在最佳评级列表顶部看到的内容的直观感觉:给出了最坏概率的项目,给出数据。
贝叶斯统计数据让我们将这种直觉形式化......
使用贝叶斯排序方法,任何具有零数据的点都将回退到先前均值(您称之为初始分数),然后在收集数据时远离它。这也是IMDB用于计算其顶级电影列表的方法。 https://math.stackexchange.com/questions/169032/understanding-the-imdb-weighted-rating-function-for-usage-on-my-own-website
您建议记入每个对象的特定方法4个upvotes和4个downvotes相当于将平均值设为0.5,权重为8票。鉴于缺少任何其他数据,这是一个合理的开端。拉普拉斯在sunrise problem中引人注目地说,事件应该归功于成功和失败。在项目排名问题中,我们有更多的知识,因此将先验均值设置为等于平均排名是有意义的。这个先验均值的权重(或者你作为数据函数移动的速度,也称为先验方差)可能很难设置。
对于IMDB排名前250的电影,他们使用平均电影排名7.1,权重为25000票,这相当于将所有电影视为以25000&#34;免费&#开始34;投票评分为7.1