前言
最近coderbbb升级文章的排序、推荐算法,有一个排序规则是基于有效阅读和总阅读的比值排序的。类似这样的排序需求很常见,通常都有一个绕不开的问题:当数据量比较小的时候,这个比值的可信度很低。基于此,我们需要使用威尔逊置信区间(Wilson score interval)来解决该问题。
关于威尔逊置信区间(Wilson score interval)的原理介绍,可以参考:威尔逊置信区间(Wilson score interval)
Java实现威尔逊置信区间(Wilson score interval)算法
强烈建议引用成熟库,自己实现算法是一个体力活。这里推荐Apache的commons-math3
库对该算法的实现。
引入apache commons math3库
maven pom.xml文件中,添加apache commons math3的依赖,代码如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
计算威尔逊置信区间
直接使用apache commons math3的WilsonScoreInterval
类中的createInterval
方法计算威尔逊置信区间。代码如下:
public static void main(String[] args) throws Exception {
/**
* 10个阅读,3个点赞
*/
ConfidenceInterval interval = new WilsonScoreInterval().createInterval(10, 3, 0.95);
System.out.println(interval.getLowerBound() + "-" +interval.getUpperBound());
}
createInterval (int numberOfTrials, int numberOfSuccesses, double confidenceLevel)
参数解释:
numberOfTrials
必须大于0,代表总阅读量。(实验次数)numberOfSuccesses
点赞数,不能大于第一个参数。(成功次数)confidenceLevel
必须介于 0 和 1 之间(不包括),成功的真实概率落在返回区间内的期望概率。
返回值:返回一个ConfidenceInterval
对象,该对象包含置信区间的上限、下限等数据。我们一般排序是用置信区间的下限排序,该值越高,代表文章的质量越好。