Functional CPD¶
- class pgmpy.factors.hybrid.FunctionalCPD.FunctionalCPD(variable, fn, parents=[])[source]¶
Defines a Functional CPD.
Functional CPD can represent any arbitrary conditional probability distribution where the distribution to represented is defined by function (input as parameter) which calls pyro.sample function.
- Parameters:
variable (str) – Name of the variable for which this CPD is defined.
fn (callable) – A lambda function that takes a dictionary of parent variable values and returns a sampled value for the variable by calling pyro.sample.
parents (list[str], optional) – List of parent variable names (default is None for no parents).
Examples
# For P(X3| X1, X2) = N(0.2x1 + 0.3x2 + 1.0; 1), we can write
>>> from pgmpy.factors.hybrid import FunctionalCPD >>> import pyro.distributions as dist >>> cpd = FunctionalCPD( ... variable="x3", ... fn=lambda parent_sample: dist.Normal( ... 0.2 * parent_sample["x1"] + 0.3 * parent_sample["x2"] + 1.0, 1), ... parents=["x1", "x2"]) >>> cpd.variable 'x3' >>> cpd.parents ['x1', 'x2']
- sample(n_samples=100, parent_sample=None)[source]¶
Simulates a value for the variable based on its CPD.
- Parameters:
n_samples (int, (default: 100)) – The number of samples to generate.
parent_sample (pandas.DataFrame, optional) – A DataFrame where each column represents a parent variable and rows are samples.
- Returns:
sampled_values – Array of sampled values for the variable.
- Return type:
numpy.ndarray
Examples
>>> from pgmpy.factors.hybrid import FunctionalCPD >>> import pyro.distributions as dist >>> cpd = FunctionalCPD( ... variable="x3", ... fn=lambda parent_sample: dist.Normal( ... 1.0 + 0.2 * parent_sample["x1"] + 0.3 * parent_sample["x2"], 1), ... parents=["x1", "x2"])
>>> parent_samples = pd.DataFrame({'x1' : [5, 10], 'x2' : [1, -1]}) >>> cpd.sample(2, parent_samples)