def getPartialUpdate(prior, fullPosterior, updatePercentage): priorGaussian = GaussianDistribution(prior.getMean(), prior.getStandardDeviation()) posteriorGaussian = 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 Rating(partialPosteriorGaussion.getMean(), partialPosteriorGaussion.getStandardDeviation(), prior._conservativeStandardDeviationMultiplier)
def __init__(self, mean, variance, variable): name = "Prior value going to %s" % variable super(GaussianPriorFactor, self).__init__(name) msg = "message from %s to %s" % (self, variable) self._newMessage = GaussianDistribution(mean, sqrt(variance)) newMessage = Message(GaussianDistribution.fromPrecisionMean(0, 0), msg) self.createVariableToMessageBindingWithMessage(variable, newMessage)