[mlpack-git] master: Force positive-definiteness when training a Gaussian. (4536910)

gitdub at mlpack.org gitdub at mlpack.org
Mon May 16 14:57:23 EDT 2016


Repository : https://github.com/mlpack/mlpack
On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/1f562a1aba7ae55475afcc95659511c2b7f694e5...986620375ce84cdc75fdfd99f63f17b5c8ee507a

>---------------------------------------------------------------

commit 4536910b8b606a9ba2a06ae481f719f5ae2147cf
Author: Ryan Curtin <ryan at ratml.org>
Date:   Mon May 16 14:57:23 2016 -0400

    Force positive-definiteness when training a Gaussian.


>---------------------------------------------------------------

4536910b8b606a9ba2a06ae481f719f5ae2147cf
 src/mlpack/core/dists/gaussian_distribution.cpp | 33 ++++++-------------------
 1 file changed, 7 insertions(+), 26 deletions(-)

diff --git a/src/mlpack/core/dists/gaussian_distribution.cpp b/src/mlpack/core/dists/gaussian_distribution.cpp
index cd9559f..b8d1b04 100644
--- a/src/mlpack/core/dists/gaussian_distribution.cpp
+++ b/src/mlpack/core/dists/gaussian_distribution.cpp
@@ -6,6 +6,7 @@
  * Implementation of Gaussian distribution class.
  */
 #include "gaussian_distribution.hpp"
+#include <mlpack/methods/gmm/positive_definite_constraint.hpp>
 
 using namespace mlpack;
 using namespace mlpack::distribution;
@@ -116,18 +117,7 @@ void GaussianDistribution::Train(const arma::mat& observations)
   covariance /= (observations.n_cols - 1);
 
   // Ensure that the covariance is positive definite.
-  if (det(covariance) <= 1e-50)
-  {
-    Log::Debug << "GaussianDistribution::Train(): Covariance matrix is not "
-        << "positive definite. Adding perturbation." << std::endl;
-
-    double perturbation = 1e-30;
-    while (det(covariance) <= 1e-50)
-    {
-      covariance.diag() += perturbation;
-      perturbation *= 10; // Slow, but we don't want to add too much.
-    }
-  }
+  gmm::PositiveDefiniteConstraint::ApplyConstraint(covariance);
 
   FactorCovariance();
 }
@@ -173,7 +163,8 @@ void GaussianDistribution::Train(const arma::mat& observations,
   }
 
   // Normalize.
-  mean /= sumProb;
+  if (sumProb > 0)
+    mean /= sumProb;
 
   // Now find the covariance.
   for (size_t i = 0; i < observations.n_cols; i++)
@@ -183,21 +174,11 @@ void GaussianDistribution::Train(const arma::mat& observations,
   }
 
   // This is probably biased, but I don't know how to unbias it.
-  covariance /= sumProb;
+  if (sumProb > 0)
+    covariance /= sumProb;
 
   // Ensure that the covariance is positive definite.
-  if (det(covariance) <= 1e-50)
-  {
-    Log::Debug << "GaussianDistribution::Train(): Covariance matrix is not "
-        << "positive definite. Adding perturbation." << std::endl;
-
-    double perturbation = 1e-30;
-    while (det(covariance) <= 1e-50)
-    {
-      covariance.diag() += perturbation;
-      perturbation *= 10; // Slow, but we don't want to add too much.
-    }
-  }
+  gmm::PositiveDefiniteConstraint::ApplyConstraint(covariance);
 
   FactorCovariance();
 }




More information about the mlpack-git mailing list