aima.core.probability.CategoricalDistribution Maven / Gradle / Ivy
package aima.core.probability;
import java.util.Map;
import aima.core.probability.proposition.AssignmentProposition;
/**
* Artificial Intelligence A Modern Approach (3rd Edition): page 487.
*
* A probability distribution for discrete random variables with a finite set of
* values.
* Note: This definition corresponds to that given in AIMA3e pg. 487, for
* a Probability Distribution.
*
* @see Probability Distribution
*
* @author Ciaran O'Reilly
*/
public interface CategoricalDistribution extends ProbabilityMass {
/**
* Interface to be implemented by an object/algorithm that wishes to iterate
* over the possible assignments for the random variables comprising this
* categorical distribution.
*
* @see CategoricalDistribution#iterateOver(Iterator)
* @see CategoricalDistribution#iterateOver(Iterator,
* AssignmentProposition...)
*/
public interface Iterator {
/**
* Called for each possible assignment for the Random Variables
* comprising this CategoricalDistribution.
*
* @param possibleAssignment
* a possible assignment, ω, of variable/value pairs.
* @param probability
* the probability associated with ω
*/
void iterate(Map possibleAssignment,
double probability);
}
/**
* Note: Do not modify the double[] returned by this method directly.
* Instead use setValue() as this method is intended to be for read only
* purposes.
*
* @return the double[] used to represent the CategoricalDistribution.
*
* @see CategoricalDistribution#setValue(int, double)
*/
double[] getValues();
/**
* Set the value at a specified index within the distribution.
*
* @param idx
* @param value
*/
void setValue(int idx, double value);
/**
*
* @return the summation of all of the elements within the Distribution.
*/
double getSum();
/**
* Normalize the values comprising this distribution.
*
* @return this instance with its values normalized.
*/
CategoricalDistribution normalize();
/**
* Retrieve the index into the CategoricalDistribution for the provided set
* of values for the random variables comprising the Distribution.
*
* @param values
* an ordered set of values for the random variables comprising
* the Distribution (Note: the order must match the order
* of the random variables describing the distribution)
* @return the index within the Distribution for the values specified.
*
* @see CategoricalDistribution#getValues()
* @see ProbabilityDistribution#getFor()
*/
int getIndex(Object... values);
/**
* Get the marginal probability for the provided variables from this
* Distribution creating a new Distribution of the remaining variables with
* their values updated with the summed out random variables.
*
* see: AIMA3e page 492.
*
*
* @param vars
* the random variables to marginalize/sum out.
* @return a new Distribution containing any remaining random variables not
* summed out and a new set of values updated with the summed out
* values.
*/
CategoricalDistribution marginal(RandomVariable... vars);
/**
* Divide the dividend (this) CategoricalDistribution by the divisor to
* create a new CategoricalDistribution representing the quotient. The
* variables comprising the divisor distribution must be a subset of the
* dividend. However, ordering of variables does not matter as the quotient
* contains the same variables as the dividend and the internal
* implementation logic should handle iterating through the two
* distributions correctly, irrespective of the order of their variables.
*
* @param divisor
* @return a new Distribution representing the quotient of the dividend
* (this) divided by the divisor.
* @throws IllegalArgumentException
* if the variables of the divisor distribution are not a subset
* of the dividend.
*/
CategoricalDistribution divideBy(CategoricalDistribution divisor);
/**
* Multiplication of this Distribution by a given multiplier, creating a new
* Distribution representing the product of the two. Note: Is
* equivalent to pointwise product calculation on factors.
*
* see: AIMA3e Figure 14.10 page 527.
*
* Note: Default Distribution multiplication is not commutative. The reason
* is because the order of the variables comprising a Distribution dictate
* the ordering of the values for that distribution. For example (the
* General case of Baye's rule, AIMA3e pg. 496), using this API method:
*
* P(Y | X) = (P(X | Y)P(Y))/P(X)
*
* is NOT true, due to multiplication of distributions not being
* commutative. However:
*
* P(Y | X) = (P(Y)P(X | Y))/P(X)
*
* is true, using this API.
*
* The default order of the variable of the Distribution returned is the
* order of the variables as they are seen, as read from the left to right
* term, for e.g.:
*
* P(Y)P(X | Y)
*
* would give a Distribution of the following form:
* Y, X
*
* i.e. an ordered union of the variables from the two distributions.
* To override the default order of the product use multiplyByPOS().
*
* @param multiplier
*
* @return a new Distribution representing the product of this and the
* passed in multiplier. The order of the variables comprising the
* product distribution is the ordered union of the left term (this)
* and the right term (multiplier).
*
* @see CategoricalDistribution#multiplyByPOS(CategoricalDistribution,
* RandomVariable...)
*/
CategoricalDistribution multiplyBy(CategoricalDistribution multiplier);
/**
* Multiplication - Product Order Specified (POS). Note: Is
* equivalent to pointwise product calculation.
*
* see: AIMA3e Figure 14.10 page 527.
*
* Multiplication of this Distribution by a given multiplier, creating a new
* Distribution representing the product of the two. The order of the
* variables comprising the product will match those specified. For example
* (the General case of Baye's rule, AIMA3e pg. 496), using this API method:
*
* P(Y | X) = (P(X | Y)P(Y), [Y, X])/P(X)
*
* is true when the correct product order is specified.
*
* @param multiplier
* @param prodVarOrder
* the order the variables comprising the product are to be in.
*
* @return a new Distribution representing the product of this and the
* passed in multiplier. The order of the variables comprising the
* product distribution is the order specified.
*
* @see CategoricalDistribution#multiplyBy(CategoricalDistribution)
*/
CategoricalDistribution multiplyByPOS(CategoricalDistribution multiplier,
RandomVariable... prodVarOrder);
/**
* Iterate over all the possible value assignments for the Random Variables
* comprising this CategoricalDistribution.
*
* @param cdi
* the CategoricalDistribution Iterator to iterate.
*/
void iterateOver(Iterator cdi);
/**
* Iterate over all possible values assignments for the Random Variables
* comprising this CategoricalDistribution that are not in the fixed set of
* values. This allows you to iterate over a subset of possible
* combinations.
*
* @param cdi
* the CategoricalDistribution Iterator to iterate
* @param fixedValues
* Fixed values for a subset of the Random Variables comprising
* this CategoricalDistribution.
*/
void iterateOver(Iterator cdi, AssignmentProposition... fixedValues);
}