예제 #1
0
        private double Inference(
            VariationalInferenceParameter varInference,
            CorpusDocument doc,
            LLNAModel model)
        {
            double oldLHood = 0, convergence = 0;

            varInference.UpdateLikelihoodBound(doc, model);
            do
            {
                varInference.IncrementIter();
                varInference.OptimizeZeta(model);
                varInference.OptimizeLambda(model, doc);
                varInference.OptimizeZeta(model);
                varInference.OptimizeNu(model, doc);
                varInference.OptimizeZeta(model);
                varInference.OptimizePhi(model, doc);
                oldLHood = varInference.LHood;
                varInference.UpdateLikelihoodBound(doc, model);
                convergence = Math.Abs((oldLHood - varInference.LHood) / oldLHood);
            }while ((convergence > _parameters.VarConvergence) && (_parameters.VarMaxIter < 0 || varInference.NIter < _parameters.VarMaxIter));

            if (convergence > _parameters.VarConvergence)
            {
                varInference.Converged = false;
            }
            else
            {
                varInference.Converged = true;
            }

            return(varInference.LHood);
        }
예제 #2
0
        private ExpectationResult Expectation(
            Corpus corpus,
            LLNAModel llnaModel,
            LLNASufficientStatistics llnaSufficientStatistics,
            Matrix <double> corpusLambda,
            Matrix <double> corpusNu,
            Matrix <double> corpusPhiSum,
            bool resetVar)
        {
            double avgNIter = 0, avgConverged = 0;
            double total = 0;

            for (int i = 0; i < corpus.NbDocuments; i++)
            {
                Debug.WriteLine($"Document {i}");
                var doc          = corpus.GetDocument(i);
                var varInference = new VariationalInferenceParameter(doc.NbTerms, llnaModel.K);
                if (resetVar)
                {
                    varInference.Init(llnaModel);
                }
                else
                {
                    varInference.Lambda = corpusLambda.Row(i);
                    varInference.Nu     = corpusNu.Row(i);
                    varInference.OptimizeZeta(llnaModel);
                    varInference.OptimizePhi(llnaModel, doc);
                    varInference.NIter = 0;
                }

                var lHood = Inference(varInference, doc, llnaModel);
                llnaSufficientStatistics.Update(varInference, doc);
                total    += lHood;
                avgNIter += varInference.NIter;
                if (varInference.Converged)
                {
                    avgConverged++;
                }

                corpusLambda.SetRow(i, varInference.Lambda);
                corpusNu.SetRow(i, varInference.Nu);
                var phiSum = varInference.Phi.ColumnSum();
                corpusPhiSum.SetRow(i, phiSum);
            }

            avgNIter     = avgNIter / corpus.NbDocuments;
            avgConverged = avgConverged / corpus.NbDocuments;
            return(new ExpectationResult(avgNIter, avgConverged, total));
        }