[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