public virtual ICategoricalDistribution posteriorDistribution(IProposition phi, params IProposition[] evidence) { IProposition conjEvidence = ProbUtil.constructConjunction(evidence); // P(A | B) = P(A AND B)/P(B) - (13.3 AIMA3e) ICategoricalDistribution dAandB = jointDistribution(phi, conjEvidence); ICategoricalDistribution dEvidence = jointDistribution(conjEvidence); ICategoricalDistribution rVal = dAandB.divideBy(dEvidence); // Note: Need to ensure normalize() is called // in order to handle the case where an approximate // algorithm is used (i.e. won't evenly divide // as will have calculated on separate approximate // runs). However, this should only be done // if the all of the evidences scope are bound (if not // you are returning in essence a set of conditional // distributions, which you do not want normalized). bool unboundEvidence = false; foreach (IProposition e in evidence) { if (e.getUnboundScope().Size() > 0) { unboundEvidence = true; break; } } if (!unboundEvidence) { rVal.normalize(); } return(rVal); }
public ICategoricalDistribution posteriorDistribution(IProposition phi, params IProposition[] evidence) { IProposition conjEvidence = ProbUtil.constructConjunction(evidence); // P(A | B) = P(A AND B)/P(B) - (13.3 AIMA3e) ICategoricalDistribution dAandB = jointDistribution(phi, conjEvidence); ICategoricalDistribution dEvidence = jointDistribution(conjEvidence); return(dAandB.divideBy(dEvidence)); }