15 #ifndef MLPACK_TESTS_MAIN_TESTS_HMM_TEST_UTILS_HPP
16 #define MLPACK_TESTS_MAIN_TESTS_HMM_TEST_UTILS_HPP
23 template<
typename HMMType>
26 const size_t states = 2;
29 Create(hmm, *trainSeq, states);
37 static void Create(HMM<DiscreteDistribution>& hmm,
38 vector<mat>& trainSeq,
40 double tolerance = 1e-05)
44 arma::Col<size_t> maxEmissions(trainSeq[0].n_rows);
46 for (vector<mat>::iterator it = trainSeq.begin(); it != trainSeq.end();
49 arma::Col<size_t> maxSeqs =
50 arma::conv_to<arma::Col<size_t>>::from(arma::max(*it, 1)) + 1;
51 maxEmissions = arma::max(maxEmissions, maxSeqs);
54 hmm = HMM<DiscreteDistribution>(size_t(states),
55 DiscreteDistribution(maxEmissions), tolerance);
58 static void Create(HMM<GaussianDistribution>& hmm,
59 vector<mat>& trainSeq,
61 double tolerance = 1e-05)
64 const size_t dimensionality = trainSeq[0].n_rows;
67 for (
size_t i = 0; i < trainSeq.size(); ++i)
69 if (trainSeq[i].n_rows != dimensionality)
71 Log::Fatal <<
"Observation sequence " << i <<
" dimensionality ("
72 << trainSeq[i].n_rows <<
" is incorrect (should be "
73 << dimensionality <<
")!" << endl;
78 hmm = HMM<GaussianDistribution>(size_t(states),
79 GaussianDistribution(dimensionality), tolerance);
83 vector<mat>& trainSeq,
85 double tolerance = 1e-05)
88 const size_t dimensionality = trainSeq[0].n_rows;
89 const int gaussians = 2;
93 Log::Fatal <<
"Number of gaussians for each GMM must be specified "
94 <<
"when type = 'gmm'!" << endl;
99 Log::Fatal <<
"Invalid number of gaussians (" << gaussians <<
"); must "
100 <<
"be greater than or equal to 1." << endl;
104 hmm = HMM<GMM>(size_t(states), GMM(
size_t(gaussians), dimensionality),
111 for (
size_t i = 0; i < e.size(); ++i)
113 e[i].Probabilities().randu();
114 e[i].Probabilities() /= arma::accu(e[i].Probabilities());
120 for (
size_t i = 0; i < e.size(); ++i)
122 const size_t dimensionality = e[i].Mean().n_rows;
125 arma::mat r = arma::randu<arma::mat>(dimensionality, dimensionality);
126 e[i].Covariance(r * r.t());
132 for (
size_t i = 0; i < e.size(); ++i)
135 e[i].Weights().randu();
136 e[i].Weights() /= arma::accu(e[i].Weights());
139 for (
int g = 0; g < 2; ++g)
141 const size_t dimensionality = e[i].Component(g).Mean().n_rows;
142 e[i].Component(g).Mean().randu();
145 arma::mat r = arma::randu<arma::mat>(dimensionality,
147 e[i].Component(g).Covariance(r * r.t());
155 template<
typename HMMType>
159 hmm.Train(*trainSeq);
The core includes that mlpack expects; standard C++ includes and Armadillo.
static void Create(HMM< DiscreteDistribution > &hmm, vector< mat > &trainSeq, size_t states, double tolerance=1e-05)
Helper function to create discrete HMM.
static void Create(HMM< GaussianDistribution > &hmm, vector< mat > &trainSeq, size_t states, double tolerance=1e-05)
static void RandomInitialize(vector< DiscreteDistribution > &e)
Helper function for discrete emission distributions.
static void Apply(HMMType &hmm, vector< mat > *trainSeq)
static void RandomInitialize(vector< GaussianDistribution > &e)
static void Apply(HMMType &hmm, vector< arma::mat > *trainSeq)
static void RandomInitialize(vector< GMM > &e)
static void Create(HMM< GMM > &hmm, vector< mat > &trainSeq, size_t states, double tolerance=1e-05)