[mlpack-git] master: Implementation of HMMRegression class (5011d66)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Mar 5 22:03:12 EST 2015


Repository : https://github.com/mlpack/mlpack

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/904762495c039e345beba14c1142fd719b3bd50e...f94823c800ad6f7266995c700b1b630d5ffdcf40

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

commit 5011d665a2eb51e15e4bb6b848529ee014f243f1
Author: michaelfox99 <michaelfox99 at gmail.com>
Date:   Sat Nov 15 19:34:22 2014 +0000

    Implementation of HMMRegression class


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

5011d665a2eb51e15e4bb6b848529ee014f243f1
 src/mlpack/methods/hmm/hmm_regression_impl.hpp | 191 +++++++++++++++++++++++++
 1 file changed, 191 insertions(+)

diff --git a/src/mlpack/methods/hmm/hmm_regression_impl.hpp b/src/mlpack/methods/hmm/hmm_regression_impl.hpp
new file mode 100644
index 0000000..0da576c
--- /dev/null
+++ b/src/mlpack/methods/hmm/hmm_regression_impl.hpp
@@ -0,0 +1,191 @@
+/**
+ * @file hmm_regression_impl.hpp
+ * @author Ryan Curtin
+ * @author Tran Quoc Long
+ * @author Michael Fox
+ *
+ * Implementation of HMMRegression class.
+ */
+#ifndef __MLPACK_METHODS_HMM_HMM_REGRESSION_IMPL_HPP
+#define __MLPACK_METHODS_HMM_HMM_REGRESSION_IMPL_HPP
+
+// Just in case...
+#include "hmm_regression.hpp"
+
+namespace mlpack {
+namespace hmm {
+
+void HMMRegression::Train(const std::vector<arma::mat>& predictors,
+                          const std::vector<arma::vec>& responses)
+{
+  std::vector<arma::mat> dataSeq;
+  StackData(predictors, responses, dataSeq);
+  this->HMM::Train(dataSeq);
+}
+
+void HMMRegression::Train(const std::vector<arma::mat>& predictors,
+                          const std::vector<arma::vec>& responses,
+                          const std::vector<arma::Col<size_t> >& stateSeq)
+{
+  std::vector<arma::mat> dataSeq;
+  StackData(predictors, responses, dataSeq);
+  this->HMM::Train(dataSeq, stateSeq);
+}
+
+/**
+ * Estimate the probabilities of each hidden state at each time step for each
+ * given data observation.
+ */
+double HMMRegression::Estimate(const arma::mat& predictors,
+                               const arma::vec& responses,
+                               arma::mat& stateProb,
+                               arma::mat& forwardProb,
+                               arma::mat& backwardProb,
+                               arma::vec& scales) const
+{
+  arma::mat dataSeq;
+  StackData(predictors, responses, dataSeq);
+  return this->HMM::Estimate(dataSeq, stateProb, forwardProb,
+      backwardProb, scales);
+}
+
+/**
+ * Estimate the probabilities of each hidden state at each time step for each
+ * given data observation.
+ */
+double HMMRegression::Estimate(const arma::mat& predictors,
+                               const arma::vec& responses,
+                               arma::mat& stateProb) const
+{
+  arma::mat dataSeq;
+  StackData(predictors, responses, dataSeq);
+  return this->HMM::Estimate(dataSeq, stateProb);
+}
+
+/**
+ * Compute the most probable hidden state sequence for the given observation
+ * using the Viterbi algorithm. Returns the log-likelihood of the most likely
+ * sequence.
+ */
+double HMMRegression::Predict(const arma::mat& predictors,
+                              const arma::vec& responses,
+                              arma::Col<size_t>& stateSeq) const
+{
+  arma::mat dataSeq;
+  StackData(predictors, responses, dataSeq);
+  return this->HMM::Predict(dataSeq, stateSeq);
+}
+
+/**
+ * Compute the log-likelihood of the given data sequence.
+ */
+double HMMRegression::LogLikelihood(const arma::mat& predictors,
+                                    const arma::vec& responses) const
+{
+  arma::mat dataSeq;
+  StackData(predictors, responses, dataSeq);
+  return this->HMM::LogLikelihood(dataSeq);
+}
+
+/**
+ * HMMRegression filtering.
+ */
+void HMMRegression::Filter(const arma::mat& predictors,
+                           const arma::vec& responses,
+                           arma::vec& filterSeq,
+                           size_t ahead) const
+{
+  // First run the forward algorithm
+  arma::mat forwardProb;
+  arma::vec scales; 
+  Forward(predictors, responses, scales, forwardProb);
+  
+  // Propagate state, predictors ahead
+  if(ahead != 0) {
+    forwardProb = pow(transition, ahead)*forwardProb;
+    forwardProb = forwardProb.cols(0, forwardProb.n_cols-ahead-1);
+  }  
+  
+  // Compute expected emissions.
+  filterSeq.resize(responses.n_elem - ahead);
+  filterSeq.zeros();
+  arma::vec nextSeq;
+  for(size_t i = 0; i < emission.size(); i++)
+  {
+    emission[i].Predict(predictors.cols(ahead, predictors.n_cols-1), nextSeq);
+    filterSeq = filterSeq + nextSeq%(forwardProb.row(i).t());
+  }
+}
+
+/**
+ * HMM smoothing.
+ */
+void HMMRegression::Smooth(const arma::mat& predictors,
+                           const arma::vec& responses,
+                           arma::vec& smoothSeq) const
+{
+  // First run the forward algorithm
+  arma::mat stateProb;
+  Estimate(predictors, responses, stateProb);
+  
+  // Compute expected emissions.
+  smoothSeq.resize(responses.n_elem);
+  smoothSeq.zeros();
+  arma::vec nextSeq;
+  for(size_t i = 0; i < emission.size(); i++)
+  {
+    emission[i].Predict(predictors, nextSeq);
+    smoothSeq = smoothSeq + nextSeq%(stateProb.row(i).t());
+  }
+
+}
+
+/**
+ * The Forward procedure (part of the Forward-Backward algorithm).
+ */
+void HMMRegression::Forward(const arma::mat& predictors,
+                            const arma::vec& responses,
+                            arma::vec& scales,
+                            arma::mat& forwardProb) const
+{
+  arma::mat dataSeq;
+  StackData(predictors, responses, dataSeq);
+  this->HMM::Forward(dataSeq, scales, forwardProb);
+}
+
+
+void HMMRegression::Backward(const arma::mat& predictors,
+                             const arma::vec& responses,
+                             const arma::vec& scales,
+                             arma::mat& backwardProb) const
+{
+  arma::mat dataSeq;
+  StackData(predictors, responses, dataSeq);
+  this->HMM::Backward(dataSeq, scales, backwardProb);
+}
+
+void HMMRegression::StackData(const std::vector<arma::mat>& predictors,
+                              const std::vector<arma::vec>& responses,
+                              std::vector<arma::mat>& dataSeq) const
+{
+  arma::mat nextSeq;
+  for(size_t i = 0; i < predictors.size(); i++)
+  {
+    nextSeq = predictors[i];
+    nextSeq.insert_rows(0, responses[i].t());
+    dataSeq.push_back(nextSeq);
+  } 
+}
+
+void HMMRegression::StackData(const arma::mat& predictors,
+                              const arma::vec& responses,
+                              arma::mat& dataSeq) const
+{
+  dataSeq = predictors;
+  dataSeq.insert_rows(0, responses.t());
+}
+  
+}; // namespace hmm
+}; // namespace mlpack
+
+#endif



More information about the mlpack-git mailing list