威尔逊区间的应用

背景

点赞点踩是互联网上收集用户反馈的一个非常重要的手段,这些后验特征对于结果的排序是非常有用的;但是,我们经常会遇到这样的问题,
一个结果有5条1分的评价, 0条0分的评价,一个结果有480个1分的评价,20个0分的评价,如果直接按照good / all来算,第一个结果是1.0,第二个结果
是4.8;可是显然,第二条结果是大概率好于第一条结果的。由此,我们引入威尔逊区间的概念。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from math import sqrt

def confidence(ups, downs, z):
"""
ups : 赞成
downs : 不赞成
z : 统计量,95%的置信水平,统计量值为1.96,可以通过查表实现
"""
n = ups + downs
if n == 0:
return 0
p = float(ups) / n
return ((p + z*z/(2*n) - z * sqrt((p*(1-p)+z*z/(4*n))/n))/(1+z*z/n))


if __name__ == '__main__':
print confidence(5, 0, 1.96)
print confidence(50, 10, 1.96)
print confidence(500, 100, 1.96)
print confidence(5000, 1000, 1.96)

输出结果:

1
2
3
4
0.565508505248
0.719681485028
0.801411699243
0.823690598226

总结

涉及到所有比例置信度的问题都可以用威尔逊区间来优化

参考

  1. http://www.ruanyifeng.com/blog/2012/03/ranking_algorithm_wilson_score_interval.html
  2. https://stackoverflow.com/questions/10029588/python-implementation-of-the-wilson-score-interval
------ 本文结束 ------
k