示例#1
0
 /**
  * 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);
 }
示例#4
0
 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);
 }