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)
class GaussianPriorFactor(GaussianFactor): 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) def updateMessageVariable(self, message, variable): oldMarginal = copy(variable.getValue()) oldMessage = message newMarginal = GaussianDistribution.fromPrecisionMean( oldMarginal.getPrecisionMean() + self._newMessage.getPrecisionMean() - oldMessage.getValue().getPrecisionMean(), oldMarginal.getPrecision() + self._newMessage.getPrecision() - oldMessage.getValue().getPrecision()) variable.setValue(newMarginal) newMessage = self._newMessage message.setValue(newMessage) return GaussianDistribution.subtract(oldMarginal, newMarginal)
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)
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, )
class GaussianPriorFactor(GaussianFactor) : 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) def updateMessageVariable(self, message, variable) : oldMarginal = copy(variable.getValue()) oldMessage = message newMarginal = GaussianDistribution.fromPrecisionMean(oldMarginal.getPrecisionMean() + self._newMessage.getPrecisionMean() - oldMessage.getValue().getPrecisionMean(), oldMarginal.getPrecision() + self._newMessage.getPrecision() - oldMessage.getValue().getPrecision()) variable.setValue(newMarginal) newMessage = self._newMessage message.setValue(newMessage) return GaussianDistribution.subtract(oldMarginal, newMarginal)
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)