Exemplo n.º 1
0
	def _updateHelper(self, weights, weightsSquared, messages, variables):
		message0 = deepcopy(messages[0].value)
		marginal0 = deepcopy(variables[0].value)
		
		inverseOfNewPrecisionSum = Decimal(0.0)
		anotherInverseOfNewPrecisionSum = Decimal(0.0)
		weightedMeanSum = Decimal(0.0)
		anotherWeightedMeanSum = Decimal(0.0)
		
		for i in range(len(weightsSquared)):
			inverseOfNewPrecisionSum += Decimal(weightsSquared[i])/(variables[i + 1].value.precision - messages[i + 1].value.precision)
			diff = (variables[i + 1].value/messages[i + 1].value)
			anotherInverseOfNewPrecisionSum += Decimal(weightsSquared[i])/diff.precision
			
			weightedMeanSum += Decimal(weights[i]) * (variables[i + 1].value.precisionMean - messages[i + 1].value.precisionMean) / (variables[i + 1].value.precision - messages[i + 1].value.precision)
			anotherWeightedMeanSum += Decimal(weights[i]) * diff.precisionMean/diff.precision
			
		newPrecision = Decimal(1.0)/inverseOfNewPrecisionSum
		
		newPrecisionMean = newPrecision*weightedMeanSum
		
		newMessage = fromPrecisionMean(newPrecisionMean, newPrecision)
		oldMarginalWithoutMessage = marginal0/message0
		
		newMarginal = oldMarginalWithoutMessage*newMessage
		
		messages[0].value = newMessage
		variables[0].value = newMarginal
		
		return newMarginal - marginal0
Exemplo n.º 2
0
	def _updateMessageInternal(self, message, variable):
		oldMarginal = deepcopy(variable.value)
		oldMessage = message
		newMarginal = fromPrecisionMean(oldMarginal.precisionMean + self._newMessage.precisionMean - oldMessage.value.precisionMean, oldMarginal.precision + self._newMessage.precision - oldMessage.value.precision)
		variable.value = newMarginal
		message.value = self._newMessage
		return oldMarginal - newMarginal
Exemplo n.º 3
0
def partialUpdate(prior, fullPosterior, updatePercentage):
	priorGaussian = fromRating(prior)
	posteriorGaussian = fromRating(fullPosterior)
	precisionMeanDifference = posteriorGaussian.precisionMean - priorGaussian.precisionMean
	partialPrecisionMeanDifference = updatePercentage*precisionMeanDifference
	partialPosteriorGaussian = fromPrecisionMean(priorGaussian.precisionMean + partialPrecisionMeanDifference, priorGaussian.precision + partialPrecisionMeanDifference)
	return Rating(partialPosteriorGaussian.mean, partialPosteriorGaussian.standardDeviation, prior.conservativeStandardDeviationMultiplier)
Exemplo n.º 4
0
	def __init__(self, gameInfo, teams, teamRanks):
		self._priorLayer = PlayerPriorValuesToSkillsLayer(self, teams)
		self._gameInfo = gameInfo
		self._variableFactory = VariableFactory(lambda: fromPrecisionMean(0, 0))
		self._layers = [self._priorLayer,
				PlayerSkillsToPerformancesLayer(self),
				PlayerPerformancesToTeamPerformancesLayer(self),
				IteratedTeamDifferencesInnerLayer(
					self,
					TeamPerformancesToTeamPerformancesDifferencesLayer(self),
					TeamDifferencesComparisonLayer(self, teamRanks)
					)
				]
Exemplo n.º 5
0
	def _updateHelper(self, message1, message2, variable1, variable2):
		message1Value = deepcopy(message1.value)
		message2Value = deepcopy(message2.value)
		
		marginal1 = deepcopy(variable1.value)
		marginal2 = deepcopy(variable2.value)
		
		a = self._precision/(self._precision + marginal2.precision - message2Value.precision)
		newMessage = fromPrecisionMean(a * (marginal2.precisionMean - message2Value.precisionMean), a*(marginal2.precision - message2Value.precision))
		
		oldMarginalWithoutMessage = marginal1/message1Value
		newMarginal = oldMarginalWithoutMessage*newMessage
		
		message1.value = newMessage
		variable1.value = newMarginal
		
		return newMarginal - marginal1
Exemplo n.º 6
0
	def _updateMessageInternal(self, message, variable):
		oldMarginal = deepcopy(variable.value)
		oldMessage = deepcopy(message.value)
		messageFromVar = oldMarginal/oldMessage
		
		c = messageFromVar.precision
		d = messageFromVar.precisionMean
		sqrtC = sqrt(c)
		dOnSqrtC = d/sqrtC
		epsilonTimesSqrtC = self._epsilon*sqrtC
		
		denom = 1.0 - wExceedsMargin(dOnSqrtC, epsilonTimesSqrtC)
		
		newPrecision = c/denom
		newPrecisionMean = (d + sqrtC*vExceedsMargin(dOnSqrtC, epsilonTimesSqrtC))/denom
		
		newMarginal = fromPrecisionMean(newPrecisionMean, newPrecision)
		newMessage = oldMessage*newMarginal/oldMarginal
		
		message.value = newMessage
		variable.value = newMarginal
		
		return newMarginal - oldMarginal
Exemplo n.º 7
0
	def updateMessage(self, message, variable):
		oldMarginal = deepcopy(variable.value)
		oldMessage = deepcopy(message.value)
		messageFromVariable = oldMarginal/oldMessage
		
		c = messageFromVariable.precision
		d = messageFromVariable.precisionMean
		
		sqrtC = sqrt(c)
		dOnSqrtC = d/sqrt(c)
		
		epsilonTimesSqrtC = self._epsilon*sqrtC
	
		denominator = 1.0 - wWithinMargin(dOnSqrtC, epsilonTimesSqrtC)
		newPrecision = c/denominator
		newPrecisionMean = (d + sqrtC * vWithinMargin(dOnSqrtC, epsilonTimesSqrtC))/denominator
		
		newMarginal = fromPrecisionMean(newPrecisionMean, newPrecision)
		newMessage = oldMessage*newMarginal/oldMarginal
		
		message.value = newMessage
		variable.value = newMarginal
		
		return newMarginal - oldMarginal
Exemplo n.º 8
0
	def createVariableToMessageBinding(self, variable):
		message = Message(fromPrecisionMean(0, 0), "message from %s to %s" % (self, variable))
		return self._createVariableToMessageBindingInternal(variable, message)