/** * Sends the factor-graph message with and returns the log-normalization constant. */ protected function sendMessageVariable(Message $message, Variable $variable) { $marginal = $variable->getValue(); $messageValue = $message->getValue(); $logZ = GaussianDistribution::logProductNormalization($marginal, $messageValue); $variable->setValue(GaussianDistribution::multiply($marginal, $messageValue)); return $logZ; }
public function getLogNormalization() { $vars = $this->getVariables(); $marginal = $vars[0]->getValue(); $messages = $this->getMessages(); $message = $messages[0]->getValue(); $messageFromVariable = GaussianDistribution::divide($marginal, $message); return -GaussianDistribution::logProductNormalization($messageFromVariable, $message) + log(GaussianDistribution::cumulativeTo(($messageFromVariable->getMean() - $this->_epsilon) / $messageFromVariable->getStandardDeviation())); }
public function testLogProductNormalization() { // Verified with Ralf Herbrich's F# implementation $standardNormal = new GaussianDistribution(0, 1); $lpn = GaussianDistribution::logProductNormalization($standardNormal, $standardNormal); $this->assertEquals(-1.2655121234846454, $lpn, '', GaussianDistributionTest::ERROR_TOLERANCE); $m1s2 = new GaussianDistribution(1, 2); $m3s4 = new GaussianDistribution(3, 4); $lpn2 = GaussianDistribution::logProductNormalization($m1s2, $m3s4); $this->assertEquals(-2.5168046699816684, $lpn2, '', GaussianDistributionTest::ERROR_TOLERANCE); }
public function getLogNormalization() { $variables =& $this->getVariables(); $marginal =& $variables[0]->getValue(); $messages =& $this->getMessages(); $message =& $messages[0]->getValue(); $messageFromVariable = GaussianDistribution::divide($marginal, $message); $mean = $messageFromVariable->getMean(); $std = $messageFromVariable->getStandardDeviation(); $z = GaussianDistribution::cumulativeTo(($this->_epsilon - $mean) / $std) - GaussianDistribution::cumulativeTo((-$this->_epsilon - $mean) / $std); return -GaussianDistribution::logProductNormalization($messageFromVariable, $message) + log($z); }