예제 #1
0
 public function getPartialUpdate(Rating $prior, Rating $fullPosterior, $updatePercentage)
 {
     $priorGaussian = new GaussianDistribution($prior->getMean(), $prior->getStandardDeviation());
     $posteriorGaussian = new GaussianDistribution($fullPosterior->getMean(), $fullPosterior . getStandardDeviation());
     // From a clarification email from Ralf Herbrich:
     // "the idea is to compute a linear interpolation between the prior and posterior skills of each player
     //  ... in the canonical space of parameters"
     $precisionDifference = $posteriorGaussian->getPrecision() - $priorGaussian->getPrecision();
     $partialPrecisionDifference = $updatePercentage * $precisionDifference;
     $precisionMeanDifference = $posteriorGaussian->getPrecisionMean() - $priorGaussian . getPrecisionMean();
     $partialPrecisionMeanDifference = $updatePercentage * $precisionMeanDifference;
     $partialPosteriorGaussion = GaussianDistribution::fromPrecisionMean($priorGaussian->getPrecisionMean() + $partialPrecisionMeanDifference, $priorGaussian->getPrecision() + $partialPrecisionDifference);
     return new Rating($partialPosteriorGaussion->getMean(), $partialPosteriorGaussion->getStandardDeviation(), $prior->_conservativeStandardDeviationMultiplier);
 }
 public static function inverseCumulativeTo($x, $mean = 0.0, $standardDeviation = 1.0)
 {
     // From numerical recipes, page 320
     return $mean - sqrt(2) * $standardDeviation * GaussianDistribution::inverseErrorFunctionCumulativeTo(2 * $x);
 }