Real EMAlg::iterate( MaximizationStep &mstep ) { Real logZ = 0; Real likelihood = 0; _estep.run(); logZ = _estep.logZ(); // Expectation calculation for( Evidence::const_iterator e = _evidence.begin(); e != _evidence.end(); ++e ) { InfAlg* clamped = _estep.clone(); // Apply evidence for( Evidence::Observation::const_iterator i = e->begin(); i != e->end(); ++i ) clamped->clamp( clamped->fg().findVar(i->first), i->second ); clamped->init(); clamped->run(); likelihood += clamped->logZ() - logZ; mstep.addExpectations( *clamped ); delete clamped; } // Maximization of parameters mstep.maximize( _estep.fg() ); return likelihood; }
/** Only maximization step included * * This function performs maximization based on the evidence collected from tab file * Since there's no belief propagation stage, it does not return proper likelihood. */ Real UnsafeEmalg::iterateWithoutEstep(MaximizationStep &mstep) { Real logZ = 0; Real likelihood = 0; // Expectation calculation int nProcessed = 0; for( Evidence::const_iterator e = _evidence.begin(); e != _evidence.end(); ++e ) { InfAlg* clamped = _estep.clone(); // Apply evidence for( Evidence::Observation::const_iterator i = e->begin(); i != e->end(); ++i ) clamped->clamp( clamped->fg().findVar(i->first), i->second ); mstep.addExpectations( *clamped ); delete clamped; nProcessed++; if (nProcessed % 10 == 0) { cout << nProcessed << " number of samples processed" << endl; } } // Maximization of parameters mstep.maximize(_estep.fg()); return likelihood; }
Real EM_estep(MaximizationStep &mstep, const Evidence &evidence, InfAlg &inf) { Real likelihood = 0; inf.run(); Real logZ = inf.logZ(); // Expectation calculation for (Evidence::const_iterator e = evidence.begin(); e != evidence.end(); ++e) { InfAlg* clamped = inf.clone(); // Apply evidence for (Evidence::Observation::const_iterator i = e->begin(); i != e->end(); ++i) clamped->clamp(clamped->fg().findVar(i->first), i->second); clamped->init(); clamped->run(); likelihood += clamped->logZ() - logZ; mstep.addExpectations(*clamped); delete clamped; } return likelihood; }