MLPACK
1.0.4
|
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() { /* nothing to do */ } 00060 00069 DiscreteDistribution(const size_t numObservations) : 00070 probabilities(arma::ones<arma::vec>(numObservations) / numObservations) 00071 { /* nothing to do */ } 00072 00079 DiscreteDistribution(const arma::vec& probabilities) 00080 { 00081 // We must be sure that our distribution is normalized. 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 // Adding 0.5 helps ensure that we cast the floating point to a size_t 00108 // correctly. 00109 return probabilities((size_t) (observation[0] + 0.5)); 00110 } 00111 00119 arma::vec Random() const; 00120 00128 void Estimate(const arma::mat& observations); 00129 00139 void Estimate(const arma::mat& observations, 00140 const arma::vec& probabilities); 00141 00143 const arma::vec& Probabilities() const { return probabilities; } 00145 arma::vec& Probabilities() { return probabilities; } 00146 00147 /* 00148 * Returns a string representation of this object. 00149 */ 00150 std::string ToString() const; 00151 00152 private: 00153 arma::vec probabilities; 00154 }; 00155 00156 }; // namespace distribution 00157 }; // namespace mlpack 00158 00159 #endif