def create_variable_to_message_binding(self, variable): new_distribution = Gaussian.from_precision_mean(0.0, 0.0) binding = Factor.create_variable_to_message_binding_with_message( self, variable, Message(new_distribution, "message from %s to %s" % (self, variable))) return binding
def update_message_variable(self, message, variable): old_marginal = copy(variable.value) old_message = copy(message.value) message_from_var = old_marginal / old_message c = message_from_var.precision d = message_from_var.precision_mean sqrt_c = sqrt(c) d_on_sqrt_c = d / sqrt_c epsilon_times_sqrt_c = self.epsilon * sqrt_c d = message_from_var.precision_mean denom = 1.0 - w_exceeds_margin(d_on_sqrt_c, epsilon_times_sqrt_c) new_precision = c / denom new_precision_mean = (d + sqrt_c * v_exceeds_margin(d_on_sqrt_c, epsilon_times_sqrt_c)) / denom new_marginal = Gaussian.from_precision_mean(new_precision_mean, new_precision) new_message = (old_message * new_marginal) / old_marginal message.value = new_message variable.value = new_marginal return new_marginal - old_marginal
def update_message_variable(self, message, variable): old_marginal = copy(variable.value) old_message = copy(message.value) message_from_var = old_marginal / old_message c = message_from_var.precision d = message_from_var.precision_mean sqrt_c = sqrt(c) d_on_sqrt_c = d / sqrt_c epsilon_times_sqrt_c = self.epsilon * sqrt_c d = message_from_var.precision_mean denom = 1.0 - w_exceeds_margin(d_on_sqrt_c, epsilon_times_sqrt_c) new_precision = c / denom new_precision_mean = (d + sqrt_c * v_exceeds_margin( d_on_sqrt_c, epsilon_times_sqrt_c)) / denom new_marginal = Gaussian.from_precision_mean(new_precision_mean, new_precision) new_message = (old_message * new_marginal) / old_marginal message.value = new_message variable.value = new_marginal return new_marginal - old_marginal
def __init__(self, mean, variance, variable): GaussianFactor.__init__(self, "Prior value going to %s" % variable) self.new_message = Gaussian(mean, sqrt(variance)) new_message = Message(Gaussian.from_precision_mean(0, 0), "message from %s to %s" % (self, variable)) self.create_variable_to_message_binding_with_message( variable, new_message)
def create_variable_to_message_binding(self, variable): new_distribution = Gaussian.from_precision_mean(0.0, 0.0) binding = Factor.create_variable_to_message_binding_with_message( self, variable, Message(new_distribution, "message from {} to {}".format(self, variable)) ) return binding
def update_message_variable(self, message, variable): old_marginal = copy(variable.value) old_message = message new_marginal = Gaussian.from_precision_mean( old_marginal.precision_mean + self.new_message.precision_mean - old_message.value.precision_mean, old_marginal.precision + self.new_message.precision - old_message.value.precision) variable.value = new_marginal new_message = self.new_message message.value = new_message return old_marginal - new_marginal
def update_message_variable(self, message, variable): old_marginal = copy(variable.value) old_message = message new_marginal = Gaussian.from_precision_mean( old_marginal.precision_mean + self.new_message.precision_mean - old_message.value.precision_mean, old_marginal.precision + self.new_message.precision - old_message.value.precision) variable.value = new_marginal new_message = self.new_message message.value = new_message return old_marginal - new_marginal
def partial_update(self, prior, full_posterior, update_percentage): prior_gaussian = Gaussian(prior.mean, prior.stdev) posterior_gaussian = Gaussian(full_posterior.mean, full_posterior.stdev) partial_precision_diff = update_percentage * (posterior_gaussian.precision - prior_gaussian.precision) partial_precision_mean_diff = update_percentage * (posterior_gaussian.precision_mean - prior_gaussian.precision_mean) partial_posterior_gaussian = Gaussian.from_precision_mean( prior_gaussian.precision_mean + partial_precision_mean_diff, prior_gaussian.precision + partial_precision_diff) return Rating(partial_posterior_gaussian.mean, partial_posterior_gaussian.stdev)
def partial_update(self, prior, full_posterior, update_percentage): prior_gaussian = Gaussian(prior.mean, prior.stdev) posterior_gaussian = Gaussian(full_posterior.mean, full_posterior.stdev) partial_precision_diff = update_percentage * (posterior_gaussian.precision - prior_gaussian.precision) partial_precision_mean_diff = update_percentage * (posterior_gaussian.precision_mean - prior_gaussian.precision_mean) partial_posterior_gaussian = Gaussian.from_precision_mean( prior_gaussian.precision_mean + partial_precision_mean_diff, prior_gaussian.precision + partial_precision_diff) return Rating(partial_posterior_gaussian.mean, partial_posterior_gaussian.stdev)
def __init__(self, teams, team_ranks, game_info): game_info = TrueSkillGameInfo.ensure_game_info(game_info) FactorGraph.__init__(self) self.prior_layer = PlayerPriorValuesToSkillsLayer(self, teams) self.game_info = game_info new_factory = VariableFactory(lambda: Gaussian.from_precision_mean(0.0, 0.0)) self.variable_factory = new_factory self.layers = [ self.prior_layer, PlayerSkillsToPerformancesLayer(self), PlayerPerformancesToTeamPerformancesLayer(self), IteratedTeamDifferencesInnerLayer(self, TeamPerformancesToTeamPerformanceDifferencesLayer(self), TeamDifferencesComparisonLayer(self, team_ranks)) ]
def __init__(self, teams, team_ranks, game_info): game_info = TrueSkillGameInfo.ensure_game_info(game_info) FactorGraph.__init__(self) self.prior_layer = PlayerPriorValuesToSkillsLayer(self, teams) self.game_info = game_info new_factory = VariableFactory( lambda: Gaussian.from_precision_mean(0.0, 0.0)) self.variable_factory = new_factory self.layers = [ self.prior_layer, PlayerSkillsToPerformancesLayer(self), PlayerPerformancesToTeamPerformancesLayer(self), IteratedTeamDifferencesInnerLayer( self, TeamPerformancesToTeamPerformanceDifferencesLayer(self), TeamDifferencesComparisonLayer(self, team_ranks)) ]
def update_helper(self, weights, weights_squared, messages, variables): message0 = copy(messages[0].value) marginal0 = copy(variables[0].value) inverse_of_new_precision_sum = 0.0 another_inverse_of_new_precision_sum = 0.0 weighted_mean_sum = 0.0 another_weighted_mean_sum = 0.0 for i in range(len(weights_squared)): inverse_of_new_precision_sum += weights_squared[i] / ( variables[i + 1].value.precision - messages[i + 1].value.precision) diff = variables[i + 1].value / messages[i + 1].value another_inverse_of_new_precision_sum += weights_squared[ i] / diff.precision weighted_mean_sum += (weights[i] * (variables[i + 1].value.precision_mean - messages[i + 1].value.precision_mean) / (variables[i + 1].value.precision - messages[i + 1].value.precision)) another_weighted_mean_sum += weights[ i] * diff.precision_mean / diff.precision new_precision = 1.0 / inverse_of_new_precision_sum #another_new_precision = 1.0 / another_inverse_of_new_precision_sum new_precision_mean = new_precision * weighted_mean_sum #another_new_precision_mean = another_new_precision * another_weighted_mean_sum new_message = Gaussian.from_precision_mean(new_precision_mean, new_precision) old_marginal_without_message = marginal0 / message0 new_marginal = old_marginal_without_message * new_message messages[0].value = new_message variables[0].value = new_marginal final_diff = new_marginal - marginal0 return final_diff
def update_helper(self, message1, message2, variable1, variable2): message1_value = copy(message1.value) message2_value = copy(message2.value) marginal1 = copy(variable1.value) marginal2 = copy(variable2.value) a = self.precision / (self.precision + marginal2.precision - message2_value.precision) new_message = Gaussian.from_precision_mean( a * (marginal2.precision_mean - message2_value.precision_mean), a * (marginal2.precision - message2_value.precision)) old_marginal_without_message = marginal1 / message1_value new_marginal = old_marginal_without_message * new_message message1.value = new_message variable1.value = new_marginal return new_marginal - marginal1
def update_helper(self, message1, message2, variable1, variable2): message1_value = copy(message1.value) message2_value = copy(message2.value) marginal1 = copy(variable1.value) marginal2 = copy(variable2.value) a = self.precision / (self.precision + marginal2.precision - message2_value.precision) new_message = Gaussian.from_precision_mean( a * (marginal2.precision_mean - message2_value.precision_mean), a * (marginal2.precision - message2_value.precision)) old_marginal_without_message = marginal1 / message1_value new_marginal = old_marginal_without_message * new_message message1.value = new_message variable1.value = new_marginal return new_marginal - marginal1
def update_helper(self, weights, weights_squared, messages, variables): message0 = copy(messages[0].value) marginal0 = copy(variables[0].value) inverse_of_new_precision_sum = 0.0 another_inverse_of_new_precision_sum = 0.0 weighted_mean_sum = 0.0 another_weighted_mean_sum = 0.0 for i in range(len(weights_squared)): inverse_of_new_precision_sum += weights_squared[i] / (variables[i + 1].value.precision - messages[i + 1].value.precision) diff = variables[i + 1].value / messages[i + 1].value another_inverse_of_new_precision_sum += weights_squared[i] / diff.precision weighted_mean_sum += (weights[i] * (variables[i + 1].value.precision_mean - messages[i + 1].value.precision_mean) / (variables[i + 1].value.precision - messages[i + 1].value.precision)) another_weighted_mean_sum += weights[i] * diff.precision_mean / diff.precision new_precision = 1.0 / inverse_of_new_precision_sum # another_new_precision = 1.0 / another_inverse_of_new_precision_sum new_precision_mean = new_precision * weighted_mean_sum # another_new_precision_mean = another_new_precision * another_weighted_mean_sum new_message = Gaussian.from_precision_mean(new_precision_mean, new_precision) old_marginal_without_message = marginal0 / message0 new_marginal = old_marginal_without_message * new_message messages[0].value = new_message variables[0].value = new_marginal final_diff = new_marginal - marginal0 return final_diff
def __init__(self, mean, variance, variable): GaussianFactor.__init__(self, "Prior value going to %s" % variable) self.new_message = Gaussian(mean, sqrt(variance)) new_message = Message(Gaussian.from_precision_mean(0, 0), "message from %s to %s" % (self, variable)) self.create_variable_to_message_binding_with_message(variable, new_message)