读了如何不按平均评级进行排序之后,我想我应该试一试。
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
对象的得分为零,排名较低。
我认为一个未评级的对象应该列在没有正面评级但有一些负面影响的上面。
我认为“个人评分都是偏离基线的表示,所以我会移动基线,我会给每个对象一个‘中性’的初始分数,”所以我想出了这样的结论:
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
这更接近我想要的分数,作为一个数字黑客,我想这是可行的,但我不能数学证明它是正确的,
有没有更好的方法,“正确”的方法?
发布于 2015-05-07 12:59:42
之所以出现这个问题,是因为这种近似(置信下限)实际上是为了识别列表中的最高等级项目。如果你对最低排名感兴趣,你可以选择更高的信心范围。
或者,我们使用贝叶斯统计,这正是您描述的第二种方法的形式化。埃文·米勒( Evan )实际上有一个后续员额,他在其中说:
我之前提出的解决方案--使用平均值周围置信区间的下限--是计算机程序员所称的黑客。它的作用并不是因为它是一个普遍的最佳解决方案,而是因为它大致符合我们的直觉,即我们希望在一个最好的列表中看到的东西:考虑到数据,最不可能坏的项目。 贝叶斯统计数据让我们把直觉正规化..。
使用贝叶斯排序方法,任何数据为零的点都会回到先前的平均值(您所称的初始分数),然后在收集数据时离开它。这也是IMDB用来计算他们的顶级电影列表的方法。https://math.stackexchange.com/questions/169032/understanding-the-imdb-weighted-rating-function-for-usage-on-my-own-website
你建议的具体方法是将每一目标记为4票、4票、4票,这相当于将平均票数为0.5,权重为8票。由于没有任何其他数据,这是一个合理的开端。拉普拉斯在“日出问题”中提出了著名的观点,认为事件应该归功于1次成功和1次失败。在项目排序问题中,我们有更多的知识,因此将先验均值设置为平均排序是有意义的。设置这个先验均值的权重(或将其作为数据函数(也称为先验方差)的移动速度)具有很大的挑战性。
对于IMDB的前250个电影排名,他们使用的平均电影排名为7.1,权重为25000票,这相当于将所有电影视为以25000张“免费”投票开始,评级为7.1。
https://stackoverflow.com/questions/12690951
复制