Change DiagCovGaussianDistribution to DiagonalGaussianDistribution

This commit is contained in:
KimSangYeon-DGU
2019-03-03 02:28:40 +09:00
parent 433b672913
commit 701185301e
13 changed files with 133 additions and 124 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
### mlpack 3.1.0
###### ????-??-??
* Add DiagCovGaussianDistribution and DiagonalGMM classes to speed up the
* Add DiagonalGaussianDistribution and DiagonalGMM classes to speed up the
diagonal covariance computation and deprecate DiagonalConstraint (#1666).
* Add kernel density estimation (KDE) implementation with bindings to other
+1 -1
View File
@@ -281,7 +281,7 @@
#include <mlpack/core/dists/gaussian_distribution.hpp>
#include <mlpack/core/dists/laplace_distribution.hpp>
#include <mlpack/core/dists/gamma_distribution.hpp>
#include <mlpack/core/dists/diag_cov_gaussian_distribution.hpp>
#include <mlpack/core/dists/diagonal_gaussian_distribution.hpp>
// mlpack::backtrace only for linux
#ifdef HAS_BFD_DL
+2 -2
View File
@@ -11,8 +11,8 @@ set(SOURCES
regression_distribution.cpp
gamma_distribution.hpp
gamma_distribution.cpp
diag_cov_gaussian_distribution.hpp
diag_cov_gaussian_distribution.cpp
diagonal_gaussian_distribution.hpp
diagonal_gaussian_distribution.cpp
)
# add directory name to sources
@@ -1,5 +1,5 @@
/**
* @file diag_cov_gaussian_distribution.cpp
* @file diagonal_gaussian_distribution.cpp
* @author Kim SangYeon
*
* Implementation of Gaussian distribution class with diagonal covariance.
@@ -9,13 +9,13 @@
* 3-clause BSD license along with mlpack. If not, see
* http://www.opensource.org/licenses/BSD-3-Clause for more information.
*/
#include "diag_cov_gaussian_distribution.hpp"
#include "diagonal_gaussian_distribution.hpp"
#include <mlpack/methods/gmm/diagonal_constraint.hpp>
using namespace mlpack;
using namespace mlpack::distribution;
DiagCovGaussianDistribution::DiagCovGaussianDistribution(
DiagonalGaussianDistribution::DiagonalGaussianDistribution(
const arma::vec& mean,
const arma::vec& covariance) :
mean(mean)
@@ -23,21 +23,21 @@ DiagCovGaussianDistribution::DiagCovGaussianDistribution(
Covariance(covariance);
}
void DiagCovGaussianDistribution::Covariance(const arma::vec& covariance)
void DiagonalGaussianDistribution::Covariance(const arma::vec& covariance)
{
this->covariance = covariance;
InvertCovariance();
LogDeterminant();
}
void DiagCovGaussianDistribution::Covariance(arma::vec&& covariance)
void DiagonalGaussianDistribution::Covariance(arma::vec&& covariance)
{
this->covariance = std::move(covariance);
InvertCovariance();
LogDeterminant();
}
double DiagCovGaussianDistribution::LogProbability(
double DiagonalGaussianDistribution::LogProbability(
const arma::vec& observation) const
{
const size_t k = observation.n_elem;
@@ -46,24 +46,24 @@ double DiagCovGaussianDistribution::LogProbability(
return -0.5 * k * log2pi - 0.5 * logDetCov - 0.5 * logExponent(0);
}
void DiagCovGaussianDistribution::InvertCovariance()
void DiagonalGaussianDistribution::InvertCovariance()
{
// Calculate the inverse of the diagonal covariance.
invCov = 1/covariance;
}
void DiagCovGaussianDistribution::LogDeterminant()
void DiagonalGaussianDistribution::LogDeterminant()
{
// Calculate Log determinant of the diagonal covariance.
logDetCov = arma::accu(log(covariance));
}
arma::vec DiagCovGaussianDistribution::Random() const
arma::vec DiagonalGaussianDistribution::Random() const
{
return (arma::sqrt(covariance) % arma::randn<arma::vec>(mean.n_elem)) + mean;
}
void DiagCovGaussianDistribution::Train(const arma::mat& observations)
void DiagonalGaussianDistribution::Train(const arma::mat& observations)
{
if (observations.n_cols > 1)
{
@@ -95,8 +95,8 @@ void DiagCovGaussianDistribution::Train(const arma::mat& observations)
LogDeterminant();
}
void DiagCovGaussianDistribution::Train(const arma::mat& observations,
const arma::vec& probabilities)
void DiagonalGaussianDistribution::Train(const arma::mat& observations,
const arma::vec& probabilities)
{
if (observations.n_cols > 0)
{
@@ -1,5 +1,5 @@
/**
* @file diag_cov_gaussian_distribution.hpp
* @file diagonal_gaussian_distribution.hpp
* @author Kim SangYeon
*
* Implementation of the Gaussian distribution with diagonal covariance.
@@ -9,8 +9,8 @@
* 3-clause BSD license along with mlpack. If not, see
* http://www.opensource.org/licenses/BSD-3-Clause for more information.
*/
#ifndef MLPACK_CORE_DISTRIBUTIONS_DIAG_COV_GAUSSIAN_DISTRIBUTION_HPP
#define MLPACK_CORE_DISTRIBUTIONS_DIAG_COV_GAUSSIAN_DISTRIBUTION_HPP
#ifndef MLPACK_CORE_DISTRIBUTIONS_DIAGONAL_GAUSSIAN_DISTRIBUTION_HPP
#define MLPACK_CORE_DISTRIBUTIONS_DIAGONAL_GAUSSIAN_DISTRIBUTION_HPP
#include <mlpack/prereqs.hpp>
@@ -18,7 +18,7 @@ namespace mlpack {
namespace distribution {
//! A single multivariate Gaussian distribution with diagonal covariance.
class DiagCovGaussianDistribution
class DiagonalGaussianDistribution
{
private:
//! Mean of the distribution.
@@ -41,13 +41,13 @@ class DiagCovGaussianDistribution
public:
//! Default constructor, which creates a Gaussian with zero dimension.
DiagCovGaussianDistribution() : logDetCov(0.0) { /* nothing to do. */ }
DiagonalGaussianDistribution() : logDetCov(0.0) { /* nothing to do. */ }
/**
* Create a Gaussian Distribution with zero mean and diagonal covariance
* with the given dimensionality.
*/
DiagCovGaussianDistribution(const size_t dimension) :
DiagonalGaussianDistribution(const size_t dimension) :
mean(arma::zeros<arma::vec>(dimension)),
covariance(arma::ones<arma::vec>(dimension)),
invCov(arma::ones<arma::vec>(dimension)),
@@ -58,8 +58,8 @@ class DiagCovGaussianDistribution
* Create a Guassian distribution with the given mean and diagonal
* covariance.
*/
DiagCovGaussianDistribution(const arma::vec& mean,
const arma::vec& covariance);
DiagonalGaussianDistribution(const arma::vec& mean,
const arma::vec& covariance);
//! Return the dimensionalty of this distribution.
size_t Dimensionality() const { return mean.n_elem; }
@@ -157,7 +157,7 @@ class DiagCovGaussianDistribution
* @param observations Matrix of observations.
* @param probabilities Output log probabilities for each input observation.
*/
inline void DiagCovGaussianDistribution::LogProbability(
inline void DiagonalGaussianDistribution::LogProbability(
const arma::mat& observations,
arma::vec& logProbabilities) const
{
+3 -2
View File
@@ -26,7 +26,8 @@ namespace gmm {
DiagonalGMM::DiagonalGMM(const size_t gaussians, const size_t dimensionality) :
gaussians(gaussians),
dimensionality(dimensionality),
dists(gaussians, distribution::DiagCovGaussianDistribution(dimensionality)),
dists(gaussians,
distribution::DiagonalGaussianDistribution(dimensionality)),
weights(gaussians)
{
// Set equal weights. Technically this model is still valid, but only barely.
@@ -154,7 +155,7 @@ void DiagonalGMM::Classify(const arma::mat& observations,
*/
double DiagonalGMM::LogLikelihood(
const arma::mat& observations,
const std::vector<distribution::DiagCovGaussianDistribution>& dists,
const std::vector<distribution::DiagonalGaussianDistribution>& dists,
const arma::vec& weights) const
{
double logLikelihood = 0;
+19 -17
View File
@@ -15,7 +15,7 @@
#define MLPACK_METHODS_GMM_DIAGONAL_GMM_HPP
#include <mlpack/prereqs.hpp>
#include <mlpack/core/dists/diag_cov_gaussian_distribution.hpp>
#include <mlpack/core/dists/diagonal_gaussian_distribution.hpp>
// This is the default fitting method class.
#include "em_fit.hpp"
@@ -37,14 +37,16 @@ namespace gmm /** Gaussian Mixture Models. */ {
* It must provide the following two functions:
*
* @code
* void Estimate(const arma::mat& observations,
* std::vector<distribution::DiagCovGaussianDistribution>& dists,
* arma::vec& weights);
* void Estimate(
* const arma::mat& observations,
* std::vector<distribution::DiagonalGaussianDistribution>& dists,
* arma::vec& weights);
*
* void Estimate(const arma::mat& observations,
* const arma::vec& probabilities,
* std::vector<distribution::DiagCovGaussianDistribution>& dists,
* arma::vec& weights);
* void Estimate(
* const arma::mat& observations,
* const arma::vec& probabilities,
* std::vector<distribution::DiagonalGaussianDistribution>& dists,
* arma::vec& weights);
* @endcode
*
* Example use:
@@ -75,7 +77,7 @@ class DiagonalGMM
size_t dimensionality;
//! Vector of Gaussians
std::vector<distribution::DiagCovGaussianDistribution> dists;
std::vector<distribution::DiagonalGaussianDistribution> dists;
//! Vector of a priori weights for each Gaussian.
arma::vec weights;
@@ -110,7 +112,7 @@ class DiagonalGMM
* @param dists Distributions of the model.
* @param weights Weights of the model.
*/
DiagonalGMM(const std::vector<distribution::DiagCovGaussianDistribution>&
DiagonalGMM(const std::vector<distribution::DiagonalGaussianDistribution>&
dists, const arma::vec& weights) :
gaussians(dists.size()),
dimensionality((!dists.empty()) ? dists[0].Mean().n_elem : 0),
@@ -133,14 +135,14 @@ class DiagonalGMM
*
* @param i index of component.
*/
const distribution::DiagCovGaussianDistribution& Component(size_t i) const {
const distribution::DiagonalGaussianDistribution& Component(size_t i) const {
return dists[i]; }
/**
* Return a reference to a component distribution.
*
* @param i index of component.
*/
distribution::DiagCovGaussianDistribution& Component(size_t i) {
distribution::DiagonalGaussianDistribution& Component(size_t i) {
return dists[i]; }
//! Return a const reference to the a priori weights of each Gaussian.
@@ -291,7 +293,7 @@ class DiagonalGMM
*/
template<typename InitialClusteringType = kmeans::KMeans<>>
void Estimate(const arma::mat& observations,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
const bool useInitialModel = false,
const size_t maxIterations = 300,
@@ -321,7 +323,7 @@ class DiagonalGMM
template<typename InitialClusteringType = kmeans::KMeans<>>
void Estimate(const arma::mat& observations,
const arma::vec& probabilities,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
const bool useInitialModel = false,
const size_t maxIterations = 300,
@@ -346,7 +348,7 @@ class DiagonalGMM
*/
double LogLikelihood(
const arma::mat& observations,
const std::vector<distribution::DiagCovGaussianDistribution>& dists,
const std::vector<distribution::DiagonalGaussianDistribution>& dists,
const arma::vec& weights) const;
/**
@@ -362,7 +364,7 @@ class DiagonalGMM
template<typename InitialClusteringType = kmeans::KMeans<>>
void InitialClustering(
const arma::mat& observations,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
InitialClusteringType clusterer = InitialClusteringType());
@@ -385,7 +387,7 @@ class DiagonalGMM
template<typename InitialClusteringType = kmeans::KMeans<>>
void ArmadilloGMMWrapper(
const arma::mat& observations,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
const bool useInitialModel = false,
const size_t maxIterations = 300,
+10 -10
View File
@@ -47,7 +47,7 @@ double DiagonalGMM::Train(const arma::mat& observations,
// If each trial must start from the same initial location,
// we must save it.
std::vector<distribution::DiagCovGaussianDistribution> distsOrig;
std::vector<distribution::DiagonalGaussianDistribution> distsOrig;
arma::vec weightsOrig;
if (useExistingModel)
{
@@ -66,8 +66,8 @@ double DiagonalGMM::Train(const arma::mat& observations,
<< bestLikelihood << "." << std::endl;
// Now the temporary model.
std::vector<distribution::DiagCovGaussianDistribution> distsTrial(gaussians,
distribution::DiagCovGaussianDistribution(dimensionality));
std::vector<distribution::DiagonalGaussianDistribution> distsTrial(
gaussians, distribution::DiagonalGaussianDistribution(dimensionality));
arma::vec weightsTrial(gaussians);
for (size_t trial = 1; trial < trials; ++trial)
@@ -137,7 +137,7 @@ double DiagonalGMM::Train(const arma::mat& observations,
return -DBL_MAX; // It's what they asked for...
// If each trial must start from the same initial location, we must save it.
std::vector<distribution::DiagCovGaussianDistribution> distsOrig;
std::vector<distribution::DiagonalGaussianDistribution> distsOrig;
arma::vec weightsOrig;
if (useExistingModel)
{
@@ -156,8 +156,8 @@ double DiagonalGMM::Train(const arma::mat& observations,
<< bestLikelihood << "." << std::endl;
// Now the temporary model.
std::vector<distribution::DiagCovGaussianDistribution> distsTrial(gaussians,
distribution::DiagCovGaussianDistribution(dimensionality));
std::vector<distribution::DiagonalGaussianDistribution> distsTrial(
gaussians, distribution::DiagonalGaussianDistribution(dimensionality));
arma::vec weightsTrial(gaussians);
for (size_t trial = 1; trial < trials; ++trial)
@@ -198,7 +198,7 @@ double DiagonalGMM::Train(const arma::mat& observations,
template<typename InitialClusteringType>
void DiagonalGMM::Estimate(
const arma::mat& observations,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
const bool useInitialModel,
const size_t maxIterations,
@@ -291,7 +291,7 @@ void DiagonalGMM::Estimate(
template<typename InitialClusteringType>
void DiagonalGMM::Estimate(const arma::mat& observations,
const arma::vec& probabilities,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
const bool useInitialModel,
const size_t maxIterations,
@@ -382,7 +382,7 @@ void DiagonalGMM::Estimate(const arma::mat& observations,
template<typename InitialClusteringType>
void DiagonalGMM::InitialClustering(
const arma::mat& observations,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
InitialClusteringType clusterer)
{
@@ -451,7 +451,7 @@ void DiagonalGMM::InitialClustering(
template<typename InitialClusteringType>
void DiagonalGMM::ArmadilloGMMWrapper(
const arma::mat& observations,
std::vector<distribution::DiagCovGaussianDistribution>& dists,
std::vector<distribution::DiagonalGaussianDistribution>& dists,
arma::vec& weights,
const bool useInitialModel,
const size_t maxIterations,
+25 -25
View File
@@ -1149,9 +1149,9 @@ BOOST_AUTO_TEST_CASE(RegressionDistributionTest)
* Make sure Diagonal Covariance Gaussian distributions are initialized
* correctly.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionEmptyConstructor)
BOOST_AUTO_TEST_CASE(DiagonalGaussianDistributionEmptyConstructor)
{
DiagCovGaussianDistribution d;
DiagonalGaussianDistribution d;
BOOST_REQUIRE_EQUAL(d.Mean().n_elem, 0);
BOOST_REQUIRE_EQUAL(d.Covariance().n_elem, 0);
@@ -1161,9 +1161,9 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionEmptyConstructor)
* Make sure Diagonal Covariance Gaussian distributions are initialized to
* the correct dimensionality.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionDimensionalityConstructor)
BOOST_AUTO_TEST_CASE(DiagonalGaussianDistributionDimensionalityConstructor)
{
DiagCovGaussianDistribution d(4);
DiagonalGaussianDistribution d(4);
BOOST_REQUIRE_EQUAL(d.Mean().n_elem, 4);
BOOST_REQUIRE_EQUAL(d.Covariance().n_elem, 4);
@@ -1173,12 +1173,12 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionDimensionalityConstructor)
* Make sure Diagonal Covariance Gaussian distributions are initialized
* correctly when we give a mean and covariance.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionConstructor)
BOOST_AUTO_TEST_CASE(DiagonalGaussianDistributionConstructor)
{
arma::vec mean = arma::randu<arma::vec>(3);
arma::vec covariance = arma::randu<arma::vec>(3);
DiagCovGaussianDistribution d(mean, covariance);
DiagonalGaussianDistribution d(mean, covariance);
// Make sure the mean and covariance is correct.
for (size_t i = 0; i < 3; i++)
@@ -1192,12 +1192,12 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionConstructor)
* Make sure the probability of observations is correct.
* The values were calculated using 'dmvnorm' in R.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionProbabilityTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianDistributionProbabilityTest)
{
arma::vec mean("2 5 3 4 1");
arma::vec cov("3 1 5 3 2");
DiagCovGaussianDistribution d(mean, cov);
DiagonalGaussianDistribution d(mean, cov);
// Observations lists randomly selected.
BOOST_REQUIRE_CLOSE(d.LogProbability("3 5 2 7 8"), -20.861264167855161,
@@ -1213,12 +1213,12 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionProbabilityTest)
}
/**
* Test DiagCovGaussianDistribution::Probability() in the univariate case.
* Test DiagonalGaussianDistribution::Probability() in the univariate case.
* The values were calculated using 'dmvnorm' in R.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianUnivariateProbabilityTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianUnivariateProbabilityTest)
{
DiagCovGaussianDistribution d(arma::vec("0.0"), arma::vec("1.0"));
DiagonalGaussianDistribution d(arma::vec("0.0"), arma::vec("1.0"));
// Mean: 0.0, Covariance: 1.0
BOOST_REQUIRE_CLOSE(d.Probability("0.0"), 0.3989422804014327, 1e-5);
@@ -1246,16 +1246,16 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianUnivariateProbabilityTest)
}
/**
* Test DiagCovGaussianDistribution::Probability() in the multivariate case.
* Test DiagonalGaussianDistribution::Probability() in the multivariate case.
* The values were calculated using 'dmvnorm' in R.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianMultivariateProbabilityTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianMultivariateProbabilityTest)
{
arma::vec mean("0 0");
arma::vec cov("2 2");
arma::vec obs("0 0");
DiagCovGaussianDistribution d(mean, cov);
DiagonalGaussianDistribution d(mean, cov);
BOOST_REQUIRE_CLOSE(d.Probability(obs), 0.079577471545947673, 1e-5);
@@ -1277,7 +1277,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianMultivariateProbabilityTest)
* Test the phi() function, for multiple points in the multivariate Gaussian
* case. The values were calculated using 'dmvnorm' in R.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianMultipointMultivariateProbabilityTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianMultipointMultivariateProbabilityTest)
{
arma::vec mean = "2 5 3 7 2";
arma::vec cov("9 2 1 4 8");
@@ -1287,7 +1287,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianMultipointMultivariateProbabilityTest)
"6 8 4 7 9 2;"
"4 6 7 7 3 2";
arma::vec phis;
DiagCovGaussianDistribution d(mean, cov);
DiagonalGaussianDistribution d(mean, cov);
d.LogProbability(points, phis);
BOOST_REQUIRE_EQUAL(phis.n_elem, 6);
@@ -1303,12 +1303,12 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianMultipointMultivariateProbabilityTest)
/**
* Make sure random observations follow the probability distribution correctly.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionRandomTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianDistributionRandomTest)
{
arma::vec mean("2.5 1.25");
arma::vec cov("0.50 0.25");
DiagCovGaussianDistribution d(mean, cov);
DiagonalGaussianDistribution d(mean, cov);
arma::mat obs(2, 5000);
@@ -1330,7 +1330,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionRandomTest)
/**
* Make sure that we can properly estimate from given observations.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionTrainTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianDistributionTrainTest)
{
arma::vec mean("2.5 1.5 8.2 3.1");
arma::vec cov("1.2 3.1 8.3 4.3");
@@ -1341,7 +1341,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionTrainTest)
for (size_t i = 0; i < 10000; i++)
observations.col(i) = (arma::sqrt(cov) % arma::randn<arma::vec>(4)) + mean;
DiagCovGaussianDistribution d;
DiagonalGaussianDistribution d;
// Calculate the actual mean and covariance of data using armadillo.
arma::vec actualMean = arma::mean(observations, 1);
@@ -1362,7 +1362,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianDistributionTrainTest)
* Make sure the unbiased estimator of the weighted sample works correctly.
* The values were calculated using 'cov.wt' in R.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianUnbiasedEstimatorTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianUnbiasedEstimatorTest)
{
// Generate the observations.
arma::mat observations("3 5 2 7;"
@@ -1372,7 +1372,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianUnbiasedEstimatorTest)
arma::vec probs("0.3 0.4 0.1 0.2");
DiagCovGaussianDistribution d;
DiagonalGaussianDistribution d;
// Estimate
d.Train(observations, probs);
@@ -1393,7 +1393,7 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianUnbiasedEstimatorTest)
* the weighted mean and covariance reduce to the unweighted sample mean and
* covariance.
*/
BOOST_AUTO_TEST_CASE(DiagCovGaussianWeightedParametersReductionTest)
BOOST_AUTO_TEST_CASE(DiagonalGaussianWeightedParametersReductionTest)
{
arma::vec mean("2.5 1.5 8.2 3.1");
arma::vec cov("1.2 3.1 8.3 4.3");
@@ -1405,8 +1405,8 @@ BOOST_AUTO_TEST_CASE(DiagCovGaussianWeightedParametersReductionTest)
for (size_t i = 0; i < 5; i++)
obs.col(i) = (arma::sqrt(cov) % arma::randn<arma::vec>(4)) + mean;
DiagCovGaussianDistribution d1;
DiagCovGaussianDistribution d2;
DiagonalGaussianDistribution d1;
DiagonalGaussianDistribution d2;
// Estimate
d1.Train(obs);
+19 -13
View File
@@ -804,8 +804,8 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMProbabilityTest)
{
// Create DiagonalGMM.
DiagonalGMM gmm(2, 2);
gmm.Component(0) = distribution::DiagCovGaussianDistribution("0 0", "1 1");
gmm.Component(1) = distribution::DiagCovGaussianDistribution("2 3", "3 2");
gmm.Component(0) = distribution::DiagonalGaussianDistribution("0 0", "1 1");
gmm.Component(1) = distribution::DiagonalGaussianDistribution("2 3", "3 2");
gmm.Weights() = "0.2 0.8";
// The values are calculated using mlpack's GMM class.
@@ -824,8 +824,8 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMProbabilityComponentTest)
{
// Create DiagonalGMM.
DiagonalGMM gmm(2, 2);
gmm.Component(0) = distribution::DiagCovGaussianDistribution("0 0", "1 1");
gmm.Component(1) = distribution::DiagCovGaussianDistribution("2 3", "3 2");
gmm.Component(0) = distribution::DiagonalGaussianDistribution("0 0", "1 1");
gmm.Component(1) = distribution::DiagonalGaussianDistribution("2 3", "3 2");
gmm.Weights() = "0.2 0.8";
// The values are calculated using mlpack's GMM class.
@@ -894,7 +894,7 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMTrainEMOneGaussian)
BOOST_AUTO_TEST_CASE(DiagonalGMMTrainEMOneGaussianWithProbability)
{
// Generate a diagonal covariance gaussian distribution.
distribution::DiagCovGaussianDistribution d("1.0 0.8", "1.0 2.0");
distribution::DiagonalGaussianDistribution d("1.0 0.8", "1.0 2.0");
// Generate 20000 observations, each with random probabilities.
arma::mat observations(2, 20000);
@@ -932,9 +932,12 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMTrainEMMultipleGaussians)
{
// We'll have three diagonal covariance Gaussian distributions from this
// mixture.
distribution::DiagCovGaussianDistribution d1("0.0 1.0 0.0", "1.0 0.8 1.0;");
distribution::DiagCovGaussianDistribution d2("2.0 -1.0 5.0", "3.0 1.2 1.3;");
distribution::DiagCovGaussianDistribution d3("0.0 5.0 -3.0", "2.0 0.3 1.0;");
distribution::DiagonalGaussianDistribution d1("0.0 1.0 0.0",
"1.0 0.8 1.0;");
distribution::DiagonalGaussianDistribution d2("2.0 -1.0 5.0",
"3.0 1.2 1.3;");
distribution::DiagonalGaussianDistribution d3("0.0 5.0 -3.0",
"2.0 0.3 1.0;");
// Now we'll generate points and probabilities.
arma::mat observations(3, 5000);
@@ -1009,9 +1012,12 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMTrainEMMultipleGaussiansWithProbability)
{
// We'll have three diagonal covariance Gaussian distributions from this
// mixture.
distribution::DiagCovGaussianDistribution d1("-1.5 0.8 1.0", "1.0 0.8 1.0;");
distribution::DiagCovGaussianDistribution d2("2.0 -1.0 5.0", "3.0 1.2 1.3;");
distribution::DiagCovGaussianDistribution d3("1.4 5.0 -3.0", "2.0 2.3 1.0;");
distribution::DiagonalGaussianDistribution d1("-1.5 0.8 1.0",
"1.0 0.8 1.0;");
distribution::DiagonalGaussianDistribution d2("2.0 -1.0 5.0",
"3.0 1.2 1.3;");
distribution::DiagonalGaussianDistribution d3("1.4 5.0 -3.0",
"2.0 2.3 1.0;");
// Now we'll generate observations and probabilities.
arma::mat observations(3, 10000);
@@ -1091,10 +1097,10 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMRandomTest)
DiagonalGMM gmm(2, 2);
gmm.Weights() = arma::vec("0.40 0.60");
gmm.Component(0) = distribution::DiagCovGaussianDistribution("1.05 2.60",
gmm.Component(0) = distribution::DiagonalGaussianDistribution("1.05 2.60",
"0.95 1.01");
gmm.Component(1) = distribution::DiagCovGaussianDistribution("4.30 1.00",
gmm.Component(1) = distribution::DiagonalGaussianDistribution("4.30 1.00",
"1.05 0.97");
// Now generate a bunch of observations.
+24 -24
View File
@@ -1243,18 +1243,18 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMPredictTest)
std::vector<DiagonalGMM> gmms(2);
gmms[0] = DiagonalGMM(2, 2);
gmms[0].Component(0) = DiagCovGaussianDistribution("3.25 2.10",
gmms[0].Component(0) = DiagonalGaussianDistribution("3.25 2.10",
"0.97 1.00");
gmms[0].Component(1) = DiagCovGaussianDistribution("5.03 7.28",
gmms[0].Component(1) = DiagonalGaussianDistribution("5.03 7.28",
"1.20 0.89");
gmms[1] = DiagonalGMM(3, 2);
gmms[1].Weights() = arma::vec("0.3 0.2 0.5");
gmms[1].Component(0) = DiagCovGaussianDistribution("-2.48 -3.02",
gmms[1].Component(0) = DiagonalGaussianDistribution("-2.48 -3.02",
"1.02 0.80");
gmms[1].Component(0) = DiagCovGaussianDistribution("-1.24 -2.40",
gmms[1].Component(0) = DiagonalGaussianDistribution("-1.24 -2.40",
"0.85 0.78");
gmms[1].Component(0) = DiagCovGaussianDistribution("-5.68 -4.83",
gmms[1].Component(0) = DiagonalGaussianDistribution("-5.68 -4.83",
"1.42 0.96");
// Initial probabilities.
@@ -1314,14 +1314,14 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMPredictTest)
BOOST_AUTO_TEST_CASE(DiagonalGMMHMMGenerateTest)
{
// Build the model.
HMM<DiagCovGaussianDistribution> hmm(3, DiagCovGaussianDistribution(2));
HMM<DiagonalGaussianDistribution> hmm(3, DiagonalGaussianDistribution(2));
hmm.Transition() = arma::mat("0.2 0.3 0.8;"
"0.4 0.5 0.1;"
"0.4 0.2 0.1");
hmm.Emission()[0] = DiagCovGaussianDistribution("0.0 0.0", "1.0 0.7");
hmm.Emission()[1] = DiagCovGaussianDistribution("1.0 1.0", "0.7 0.5");
hmm.Emission()[2] = DiagCovGaussianDistribution("-3.0 2.0", "2.0 0.3");
hmm.Emission()[0] = DiagonalGaussianDistribution("0.0 0.0", "1.0 0.7");
hmm.Emission()[1] = DiagonalGaussianDistribution("1.0 1.0", "0.7 0.5");
hmm.Emission()[2] = DiagonalGaussianDistribution("-3.0 2.0", "2.0 0.3");
// Now we will generate a long sequence.
std::vector<arma::mat> observations(1);
@@ -1331,7 +1331,7 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMGenerateTest)
hmm.Generate(10000, observations[0], states[0], 1);
// Build the hmm2.
HMM<DiagCovGaussianDistribution> hmm2(3, DiagCovGaussianDistribution(2));
HMM<DiagonalGaussianDistribution> hmm2(3, DiagonalGaussianDistribution(2));
// Now estimate the HMM from the generated sequence.
hmm2.Train(observations, states);
@@ -1356,7 +1356,7 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMGenerateTest)
BOOST_AUTO_TEST_CASE(DiagonalGMMHMMOneGaussianOneStateTrainingTest)
{
// Create a gaussian distribution with diagonal covariance.
DiagCovGaussianDistribution d("2.05 3.45", "0.89 1.05");
DiagonalGaussianDistribution d("2.05 3.45", "0.89 1.05");
// Make a sequence of observations.
std::vector<arma::mat> observations(1, arma::mat(2, 5000));
@@ -1394,10 +1394,10 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMOneGaussianUnlabeledTrainingTest)
{
// Create a sequence of DiagonalGMMs. Each GMM has one gaussian distribution.
std::vector<DiagonalGMM> gmms(2, DiagonalGMM(1, 2));
gmms[0].Component(0) = DiagCovGaussianDistribution("1.25 2.10",
gmms[0].Component(0) = DiagonalGaussianDistribution("1.25 2.10",
"0.97 1.00");
gmms[1].Component(0) = DiagCovGaussianDistribution("-2.48 -3.02",
gmms[1].Component(0) = DiagonalGaussianDistribution("-2.48 -3.02",
"1.02 0.80");
// Transition matrix.
@@ -1467,13 +1467,13 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMOneGaussianLabeledTrainingTest)
{
// Create a sequence of DiagonalGMMs.
std::vector<DiagonalGMM> gmms(3, DiagonalGMM(1, 2));
gmms[0].Component(0) = DiagCovGaussianDistribution("5.25 7.10",
gmms[0].Component(0) = DiagonalGaussianDistribution("5.25 7.10",
"0.97 1.00");
gmms[1].Component(0) = DiagCovGaussianDistribution("4.48 6.02",
gmms[1].Component(0) = DiagonalGaussianDistribution("4.48 6.02",
"1.02 0.80");
gmms[2].Component(0) = DiagCovGaussianDistribution("-3.28 -5.30",
gmms[2].Component(0) = DiagonalGaussianDistribution("-3.28 -5.30",
"0.87 1.05");
// Transition matrix.
@@ -1550,15 +1550,15 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMMultipleGaussiansUnlabeledTrainingTest)
// Create a sequence of DiagonalGMMs.
std::vector<DiagonalGMM> gmms(2, DiagonalGMM(2, 2));
gmms[0].Weights() = arma::vec("0.3 0.7");
gmms[0].Component(0) = DiagCovGaussianDistribution("8.25 7.10",
gmms[0].Component(0) = DiagonalGaussianDistribution("8.25 7.10",
"0.97 1.00");
gmms[0].Component(1) = DiagCovGaussianDistribution("-3.03 -2.28",
gmms[0].Component(1) = DiagonalGaussianDistribution("-3.03 -2.28",
"1.20 0.89");
gmms[1].Weights() = arma::vec("0.4 0.6");
gmms[1].Component(0) = DiagCovGaussianDistribution("4.48 6.02",
gmms[1].Component(0) = DiagonalGaussianDistribution("4.48 6.02",
"1.02 0.80");
gmms[1].Component(1) = DiagCovGaussianDistribution("-9.24 -8.40",
gmms[1].Component(1) = DiagonalGaussianDistribution("-9.24 -8.40",
"0.85 1.58");
// Transition matrix.
@@ -1657,15 +1657,15 @@ BOOST_AUTO_TEST_CASE(DiagonalGMMHMMMultipleGaussiansLabeledTrainingTest)
// Create a sequence of DiagonalGMMs.
std::vector<DiagonalGMM> gmms(2, DiagonalGMM(2, 2));
gmms[0].Weights() = arma::vec("0.3 0.7");
gmms[0].Component(0) = DiagCovGaussianDistribution("2.25 5.30",
gmms[0].Component(0) = DiagonalGaussianDistribution("2.25 5.30",
"0.97 1.00");
gmms[0].Component(1) = DiagCovGaussianDistribution("-3.15 -2.50",
gmms[0].Component(1) = DiagonalGaussianDistribution("-3.15 -2.50",
"1.20 0.89");
gmms[1].Weights() = arma::vec("0.4 0.6");
gmms[1].Component(0) = DiagCovGaussianDistribution("-4.48 -6.30",
gmms[1].Component(0) = DiagonalGaussianDistribution("-4.48 -6.30",
"1.02 0.80");
gmms[1].Component(1) = DiagCovGaussianDistribution("5.24 2.40",
gmms[1].Component(1) = DiagonalGaussianDistribution("5.24 2.40",
"0.85 1.58");
// Transition matrix.
@@ -182,15 +182,15 @@ BOOST_AUTO_TEST_CASE(HMMGenerateDiagonalGMMHMMCheckDimensionsTest)
h->DiagGMMHMM()->Emission().resize(2);
h->DiagGMMHMM()->Emission()[0] = DiagonalGMM(2, 2);
h->DiagGMMHMM()->Emission()[0].Weights() = arma::vec("0.2 0.8");
h->DiagGMMHMM()->Emission()[0].Component(0) = DiagCovGaussianDistribution(
h->DiagGMMHMM()->Emission()[0].Component(0) = DiagonalGaussianDistribution(
"2.75 1.60", "0.50 0.50");
h->DiagGMMHMM()->Emission()[0].Component(1) = DiagCovGaussianDistribution(
h->DiagGMMHMM()->Emission()[0].Component(1) = DiagonalGaussianDistribution(
"6.15 2.51", "1.00 1.50");
h->DiagGMMHMM()->Emission()[1] = DiagonalGMM(2, 2);
h->DiagGMMHMM()->Emission()[1].Weights() = arma::vec("0.4 0.6");
h->DiagGMMHMM()->Emission()[1].Component(0) = DiagCovGaussianDistribution(
h->DiagGMMHMM()->Emission()[1].Component(0) = DiagonalGaussianDistribution(
"-1.00 -3.42", "0.20 1.00");
h->DiagGMMHMM()->Emission()[1].Component(1) = DiagCovGaussianDistribution(
h->DiagGMMHMM()->Emission()[1].Component(1) = DiagonalGaussianDistribution(
"-3.10 -5.05", "1.20 0.80");
// Now that we have a trained HMM model, we can use it to generate a sequence
@@ -179,15 +179,15 @@ BOOST_AUTO_TEST_CASE(HMMViterbiDiagonalGMMHMMCheckDimensionsTest)
std::vector<DiagonalGMM> gmms(2, DiagonalGMM(2, 2));
gmms[0].Weights() = arma::vec("0.2 0.8");
gmms[0].Component(0) = DiagCovGaussianDistribution("2.75 1.60",
gmms[0].Component(0) = DiagonalGaussianDistribution("2.75 1.60",
"0.50 0.50");
gmms[0].Component(1) = DiagCovGaussianDistribution("6.15 2.51",
gmms[0].Component(1) = DiagonalGaussianDistribution("6.15 2.51",
"1.00 1.50");
gmms[1].Weights() = arma::vec("0.4 0.6");
gmms[1].Component(0) = DiagCovGaussianDistribution("-1.00 -3.42",
gmms[1].Component(0) = DiagonalGaussianDistribution("-1.00 -3.42",
"0.20 1.00");
gmms[1].Component(1) = DiagCovGaussianDistribution("-3.10 -5.05",
gmms[1].Component(1) = DiagonalGaussianDistribution("-3.10 -5.05",
"1.20 0.80");
// Transition matrix.