discrete_distribution.hpp
Go to the documentation of this file.00001
00023 #ifndef __MLPACK_METHODS_HMM_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_HPP
00024 #define __MLPACK_METHODS_HMM_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_HPP
00025
00026 #include <mlpack/core.hpp>
00027
00028 namespace mlpack {
00029 namespace distribution {
00030
00053 class DiscreteDistribution
00054 {
00055 public:
00059 DiscreteDistribution() { }
00060
00069 DiscreteDistribution(const size_t numObservations) :
00070 probabilities(arma::ones<arma::vec>(numObservations) / numObservations)
00071 { }
00072
00079 DiscreteDistribution(const arma::vec& probabilities)
00080 {
00081
00082 double sum = accu(probabilities);
00083 if (sum > 0)
00084 this->probabilities = probabilities / sum;
00085 else
00086 {
00087 this->probabilities.set_size(probabilities.n_elem);
00088 this->probabilities.fill(1 / probabilities.n_elem);
00089 }
00090 }
00091
00095 size_t Dimensionality() const { return 1; }
00096
00105 double Probability(const arma::vec& observation) const
00106 {
00107
00108
00109 const size_t obs = size_t(observation[0] + 0.5);
00110
00111
00112 if (obs >= probabilities.n_elem)
00113 {
00114 Log::Debug << "DiscreteDistribution::Probability(): received observation "
00115 << obs << "; observation must be in [0, " << probabilities.n_elem
00116 << "] for this distribution." << std::endl;
00117 }
00118
00119 return probabilities(obs);
00120 }
00121
00129 arma::vec Random() const;
00130
00138 void Estimate(const arma::mat& observations);
00139
00149 void Estimate(const arma::mat& observations,
00150 const arma::vec& probabilities);
00151
00153 const arma::vec& Probabilities() const { return probabilities; }
00155 arma::vec& Probabilities() { return probabilities; }
00156
00157
00158
00159
00160 std::string ToString() const;
00161
00162 private:
00163 arma::vec probabilities;
00164 };
00165
00166 };
00167 };
00168
00169 #endif