mlpack
hmm_regression_impl.hpp
Go to the documentation of this file.
1 
14 #ifndef MLPACK_METHODS_HMM_HMM_REGRESSION_IMPL_HPP
15 #define MLPACK_METHODS_HMM_HMM_REGRESSION_IMPL_HPP
16 
17 // Just in case...
18 #include "hmm_regression.hpp"
19 
20 namespace mlpack {
21 namespace hmm {
22 
23 void HMMRegression::Train(const std::vector<arma::mat>& predictors,
24  const std::vector<arma::vec>& responses)
25 {
26  std::vector<arma::mat> dataSeq;
27  StackData(predictors, responses, dataSeq);
28  this->HMM::Train(dataSeq);
29 }
30 
31 void HMMRegression::Train(const std::vector<arma::mat>& predictors,
32  const std::vector<arma::vec>& responses,
33  const std::vector<arma::Row<size_t> >& stateSeq)
34 {
35  std::vector<arma::mat> dataSeq;
36  StackData(predictors, responses, dataSeq);
37  this->HMM::Train(dataSeq, stateSeq);
38 }
39 
44 double HMMRegression::Estimate(const arma::mat& predictors,
45  const arma::vec& responses,
46  arma::mat& stateProb,
47  arma::mat& forwardProb,
48  arma::mat& backwardProb,
49  arma::vec& scales) const
50 {
51  arma::mat dataSeq;
52  StackData(predictors, responses, dataSeq);
53  return this->HMM::Estimate(dataSeq, stateProb, forwardProb,
54  backwardProb, scales);
55 }
56 
61 double HMMRegression::Estimate(const arma::mat& predictors,
62  const arma::vec& responses,
63  arma::mat& stateProb) const
64 {
65  arma::mat dataSeq;
66  StackData(predictors, responses, dataSeq);
67  return this->HMM::Estimate(dataSeq, stateProb);
68 }
69 
75 double HMMRegression::Predict(const arma::mat& predictors,
76  const arma::vec& responses,
77  arma::Row<size_t>& stateSeq) const
78 {
79  arma::mat dataSeq;
80  StackData(predictors, responses, dataSeq);
81  return this->HMM::Predict(dataSeq, stateSeq);
82 }
83 
87 double HMMRegression::LogLikelihood(const arma::mat& predictors,
88  const arma::vec& responses) const
89 {
90  arma::mat dataSeq;
91  StackData(predictors, responses, dataSeq);
92  return this->HMM::LogLikelihood(dataSeq);
93 }
94 
98 void HMMRegression::Filter(const arma::mat& predictors,
99  const arma::vec& responses,
100  arma::vec& filterSeq,
101  size_t ahead) const
102 {
103  // First run the forward algorithm
104  arma::mat forwardProb;
105  arma::vec scales;
106  Forward(predictors, responses, scales, forwardProb);
107 
108  // Propagate state, predictors ahead
109  if (ahead != 0)
110  {
111  forwardProb = pow(transition, ahead)*forwardProb;
112  forwardProb = forwardProb.cols(0, forwardProb.n_cols-ahead-1);
113  }
114 
115  // Compute expected emissions.
116  filterSeq.resize(responses.n_elem - ahead);
117  filterSeq.zeros();
118  arma::vec nextSeq;
119  for (size_t i = 0; i < emission.size(); ++i)
120  {
121  emission[i].Predict(predictors.cols(ahead, predictors.n_cols-1), nextSeq);
122  filterSeq = filterSeq + nextSeq%(forwardProb.row(i).t());
123  }
124 }
125 
129 void HMMRegression::Smooth(const arma::mat& predictors,
130  const arma::vec& responses,
131  arma::vec& smoothSeq) const
132 {
133  // First run the forward algorithm
134  arma::mat stateProb;
135  Estimate(predictors, responses, stateProb);
136 
137  // Compute expected emissions.
138  smoothSeq.resize(responses.n_elem);
139  smoothSeq.zeros();
140  arma::vec nextSeq;
141  for (size_t i = 0; i < emission.size(); ++i)
142  {
143  emission[i].Predict(predictors, nextSeq);
144  smoothSeq = smoothSeq + nextSeq%(stateProb.row(i).t());
145  }
146 }
147 
151 void HMMRegression::Forward(const arma::mat& predictors,
152  const arma::vec& responses,
153  arma::vec& scales,
154  arma::mat& forwardProb) const
155 {
156  arma::mat dataSeq;
157  StackData(predictors, responses, dataSeq);
158  this->HMM::Forward(dataSeq, scales, forwardProb);
159 }
160 
161 
162 void HMMRegression::Backward(const arma::mat& predictors,
163  const arma::vec& responses,
164  const arma::vec& scales,
165  arma::mat& backwardProb) const
166 {
167  arma::mat dataSeq;
168  StackData(predictors, responses, dataSeq);
169  this->HMM::Backward(dataSeq, scales, backwardProb);
170 }
171 
172 void HMMRegression::StackData(const std::vector<arma::mat>& predictors,
173  const std::vector<arma::vec>& responses,
174  std::vector<arma::mat>& dataSeq) const
175 {
176  arma::mat nextSeq;
177  for (size_t i = 0; i < predictors.size(); ++i)
178  {
179  nextSeq = predictors[i];
180  nextSeq.insert_rows(0, responses[i].t());
181  dataSeq.push_back(nextSeq);
182  }
183 }
184 
185 void HMMRegression::StackData(const arma::mat& predictors,
186  const arma::vec& responses,
187  arma::mat& dataSeq) const
188 {
189  dataSeq = predictors;
190  dataSeq.insert_rows(0, responses.t());
191 }
192 
193 } // namespace hmm
194 } // namespace mlpack
195 
196 #endif
double Train(const std::vector< arma::mat > &dataSeq)
Train the model using the Baum-Welch algorithm, with only the given unlabeled observations.
Definition: hmm_impl.hpp:95
std::vector< distribution::RegressionDistribution > emission
Set of emission probability distributions; one for each state.
Definition: hmm.hpp:497
double Estimate(const arma::mat &dataSeq, arma::mat &stateProb, arma::mat &forwardProb, arma::mat &backwardProb, arma::vec &scales) const
Estimate the probabilities of each hidden state at each time step for each given data observation...
Definition: hmm_impl.hpp:385
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
double Predict(const arma::mat &dataSeq, arma::Row< size_t > &stateSeq) const
Compute the most probable hidden state sequence for the given data sequence, using the Viterbi algori...
Definition: hmm_impl.hpp:486
double LogLikelihood(const arma::mat &dataSeq) const
Compute the log-likelihood of the given data sequence.
Definition: hmm_impl.hpp:554
double LogLikelihood(const arma::mat &predictors, const arma::vec &responses) const
Compute the log-likelihood of the given predictors and responses.
Definition: hmm_regression_impl.hpp:87
void Smooth(const arma::mat &predictors, const arma::vec &responses, arma::vec &smoothSeq) const
HMM smoothing.
Definition: hmm_regression_impl.hpp:129
void Filter(const arma::mat &predictors, const arma::vec &responses, arma::vec &filterSeq, size_t ahead=0) const
HMMR filtering.
Definition: hmm_regression_impl.hpp:98
void Forward(const arma::mat &dataSeq, arma::vec &logScales, arma::mat &forwardLogProb, arma::mat &logProbs) const
The Forward algorithm (part of the Forward-Backward algorithm).
Definition: hmm_impl.hpp:770
double Estimate(const arma::mat &predictors, const arma::vec &responses, arma::mat &stateProb, arma::mat &forwardProb, arma::mat &backwardProb, arma::vec &scales) const
Estimate the probabilities of each hidden state at each time step for each given data observation...
Definition: hmm_regression_impl.hpp:44
void Backward(const arma::mat &dataSeq, const arma::vec &logScales, arma::mat &backwardLogProb, arma::mat &logProbs) const
The Backward algorithm (part of the Forward-Backward algorithm).
Definition: hmm_impl.hpp:799
void Train(const std::vector< arma::mat > &predictors, const std::vector< arma::vec > &responses)
Train the model using the Baum-Welch algorithm, with only the given predictors and responses...
Definition: hmm_regression_impl.hpp:23
double Predict(const arma::mat &predictors, const arma::vec &responses, arma::Row< size_t > &stateSeq) const
Compute the most probable hidden state sequence for the given predictors and responses, using the Viterbi algorithm, returning the log-likelihood of the most likely state sequence.
Definition: hmm_regression_impl.hpp:75