示例#1
0
    def perform_ve_inference(self, query_variable, evidence_variables):
        """Calculates the probability distribution P(query_variable|evidence_variables) using variable elimination.
        Assumes that we have only one query variable.

        Keyword arguments:
        query_variable -- The name of the query variable (as called in the network).
        evidence_variables -- A dictionary containing variable names as keys and observed values as values.

        Returns:
        distribution -- A dictionary containing the values of the query variable as keys and the probabilities as values.

        """
        known_variables = list(evidence_variables.keys())
        known_variables.append(query_variable)
        hidden_variables = []
        for _,var in enumerate(self.network.V):
            if var not in known_variables:
                hidden_variables.append(var)

        variables, dependency_levels = self.__find_dependency_levels(known_variables, hidden_variables)

        #we don't want the query variable to be considered as known
        #in the factor creation process
        known_variables.remove(query_variable)
        factors = self.__create_factors(evidence_variables, variables, dependency_levels)

        current_factor = Factor()
        for i in xrange(len(hidden_variables)-1, -1, -1):
            current_factor = self.__multiply_factors(factors, current_factor, dependency_levels, i)
            current_factor.sum_out(hidden_variables[i])

        current_factor = self.__multiply_factors(factors, current_factor, dependency_levels, -1)
        alpha = sum(numpy.array(current_factor.probabilities))

        distribution = dict()
        for i,value in enumerate(current_factor.values):
            distribution[value[0]] = current_factor.probabilities[i] / alpha

        return distribution