Sometimes decision trees are quite expensive for very sparse distributions; TableDistribution instead uses a sparse matrix representation and is also used internally in many algorithms. It is a normalized discrete conditional that is convenient for priors and conditional probability tables.
import gtsam
import numpy as np
from gtsam.symbol_shorthand import M, X
from IPython.display import Markdown, displayCreating a distribution¶
A unary distribution takes a (key, cardinality) pair and either a numeric sequence or a ratio string. Numeric inputs are normalized by the conditional semantics.
weather = (gtsam.symbol("W", 0), 3)
distribution = gtsam.TableDistribution(weather, [6.0, 3.0, 1.0])
print("number of values:", distribution.nrValues())
print("table size:", distribution.table().size())Evaluating and choosing values¶
As a DiscreteConditional, the distribution supports evaluate(), logProbability(), argmax(), and sample(). evaluate() expects DiscreteValues; argmax() returns the most likely frontal value for the supplied parent assignment.
values = gtsam.DiscreteValues()
values[weather[0]] = 0
probability = distribution.evaluate(values)
print("P(W0=0):", probability)
print("most likely state:", distribution.argmax(gtsam.DiscreteValues()))
assert np.isclose(probability, 0.6)Multiple keys and table access¶
Passing DiscreteKeys creates a conditional over several frontals. table() returns the backing TableFactor, while choose(given) fixes parent values and marginal(key) removes other frontals by summation.
umbrella = (gtsam.symbol("U", 0), 2)
keys = gtsam.DiscreteKeys()
keys.push_back(weather)
keys.push_back(umbrella)
joint = gtsam.TableDistribution(keys, "6 1 3 2 1 7")
print("joint assignments:", joint.nrValues())