使用 goproblems.com 的 5 星评级系统的 Wilson 置信区间
Wilson Confidence Interval for 5 stars rating system using goproblems.com
我在理解 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;
现在我的问题是我没有得到相同的下限分数..我认为我的计算方式有问题,但我不知道是什么..
这是一个例子:上面的link goproblem打开了下限分数的结果:1.1067061310626。现在尝试反映(在上面的代码中)我得到了结果:0.9317113001849..
有些事情告诉我我完全误解了一些事情。希望你们能从这里帮助我..
有一个由 Mark Badolato 编写的 class 完全可以满足您的需要,您可以使用这个库或从他的实现中学习。
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
我在理解 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;
现在我的问题是我没有得到相同的下限分数..我认为我的计算方式有问题,但我不知道是什么..
这是一个例子:上面的link goproblem打开了下限分数的结果:1.1067061310626。现在尝试反映(在上面的代码中)我得到了结果:0.9317113001849..
有些事情告诉我我完全误解了一些事情。希望你们能从这里帮助我..
有一个由 Mark Badolato 编写的 class 完全可以满足您的需要,您可以使用这个库或从他的实现中学习。
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