У меня есть некоторые проблемы с пониманием примера по гопроблеме (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 ..
Что-то говорит мне, что я что-то совершенно не понял. Надеюсь, вы, ребята, можете помочь мне отсюда ..
Существует класс, написанный Марком Бадолато, который делает именно то, что вам нужно, вы можете либо использовать эту библиотеку, либо поучиться у его реализации.
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
Других решений пока нет …