使用goproblems.com获得5星评级系统的Wilson Confidence Interval

时间:2015-05-20 18:37:14

标签: php rating-system

通过了解goproblem(http://www.goproblems.com/test/wilson/wilson.php?v1=0&v2=2&v3=0&v4=0&v5=0)上的示例,我遇到了一些问题。

我已经从上面的例子中编写了我自己的代码(我怎么会这样做):

$stars = 4;
$n = 2;
$xbar = (($stars / $n)-1)/4;
$z = 0;
$Wilson = ((1 + 4 * (($xbar + pow($z,$n) / pow(2,$n) - $z) * sqrt($xbar * (1 - $xbar) / $n + pow($z,2) / 4 * pow($n,2))) / (1 + pow($z, 2) / $n)) - 0.374474917663);
echo $Wilson;

现在我的问题是我没有得到相同的下限分数。我认为我的计算方法有问题,但我无法弄清楚是什么......

这是一个例子:上面的goproblem链接打开了一个下限得分的结果:1.1067061310626。现在尝试镜像(在上面的代码中)我有结果:0.9317113001849 ..

某事告诉我,我完全误解了一些事情。希望你们能从这里帮助我..

1 个答案:

答案 0 :(得分:3)

马克·巴多拉托写的课程完全符合你的需要,你可以使用这个图书馆,也可以从他的实施中学习。

class WilsonConfidenceIntervalCalculator {
    const CONFIDENCE = 1.959964;

    public function getScore($positiveVotes, $totalVotes) {
        return $totalVotes ? $this->lowerBound($positiveVotes, $totalVotes) : 0;
    }

    private function lowerBound($positiveVotes, $totalVotes) {
        $phat           = 1.0 * $positiveVotes / $totalVotes;
        $numerator      = $this->calculationNumerator($totalVotes, self::CONFIDENCE, $phat);
        $denominator    = $this->calculationDenominator($totalVotes, self::CONFIDENCE);

        return $numerator / $denominator;
    }

    private function calculationDenominator($total, $z) {
        return 1 + $z * $z / $total;
    }

    private function calculationNumerator($total, $z, $phat) {
        return $phat + $z * $z / (2 * $total) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $total)) / $total);
    }
}

您可以在此处阅读有关此内容的更多信息,并了解如何运行单元测试。 https://gist.github.com/mbadolato/8253004