13 #ifndef MLPACK_CORE_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_HPP 14 #define MLPACK_CORE_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_HPP 21 namespace distribution {
52 probabilities(
std::vector<arma::vec>(1)){ }
63 probabilities(
std::vector<arma::vec>(1,
64 arma::ones<arma::vec>(numObservations) / numObservations))
77 for (
size_t i = 0; i < numObservations.n_elem; i++)
79 const size_t numObs = size_t(numObservations[i]);
82 std::ostringstream oss;
83 oss <<
"number of observations for dimension " << i <<
" is 0, but " 84 <<
"must be greater than 0";
85 throw std::invalid_argument(oss.str());
87 probabilities.push_back(arma::ones<arma::vec>(numObs) / numObs);
99 for (
size_t i = 0; i < probabilities.size(); i++)
101 arma::vec temp = probabilities[i];
102 double sum = accu(temp);
104 this->probabilities.push_back(temp / sum);
107 this->probabilities.push_back(arma::ones<arma::vec>(temp.n_elem)
128 double probability = 1.0;
130 if (observation.n_elem != probabilities.size())
132 Log::Fatal <<
"DiscreteDistribution::Probability(): observation has " 133 <<
"incorrect dimension " << observation.n_elem <<
" but should have " 134 <<
"dimension " << probabilities.size() <<
"!" << std::endl;
137 for (
size_t dimension = 0; dimension < observation.n_elem; dimension++)
141 const size_t obs = size_t(observation(dimension) + 0.5);
144 if (obs >= probabilities[dimension].n_elem)
146 Log::Fatal <<
"DiscreteDistribution::Probability(): received " 147 <<
"observation " << obs <<
"; observation must be in [0, " 148 << probabilities[dimension].n_elem <<
"] for this distribution." 151 probability *= probabilities[dimension][obs];
187 void Train(
const arma::mat& observations);
198 void Train(
const arma::mat& observations,
199 const arma::vec& probabilities);
202 arma::vec&
Probabilities(
const size_t dim = 0) {
return probabilities[dim]; }
205 {
return probabilities[dim]; }
210 template<
typename Archive>
213 ar & BOOST_SERIALIZATION_NVP(probabilities);
219 std::vector<arma::vec> probabilities;
DiscreteDistribution()
Default constructor, which creates a distribution that has no observations.
A discrete distribution where the only observations are discrete observations.
The core includes that mlpack expects; standard C++ includes and Armadillo.
arma::vec Random() const
Return a randomly generated observation (one-dimensional vector; one observation) according to the pr...
double LogProbability(const arma::vec &observation) const
Return the log probability of the given observation.
const arma::vec & Probabilities(const size_t dim=0) const
Modify the vector of probabilities for the given dimension.
static MLPACK_EXPORT util::PrefixedOutStream Fatal
Prints fatal messages prefixed with [FATAL], then terminates the program.
void serialize(Archive &ar, const unsigned int)
Serialize the distribution.
size_t Dimensionality() const
Get the dimensionality of the distribution.
DiscreteDistribution(const arma::Col< size_t > &numObservations)
Define the multidimensional discrete distribution as having numObservations possible observations...
void Train(const arma::mat &observations)
Estimate the probability distribution directly from the given observations.
Miscellaneous math random-related routines.
double Probability(const arma::vec &observation) const
Return the probability of the given observation.
arma::vec & Probabilities(const size_t dim=0)
Return the vector of probabilities for the given dimension.
DiscreteDistribution(const size_t numObservations)
Define the discrete distribution as having numObservations possible observations. ...
DiscreteDistribution(const std::vector< arma::vec > &probabilities)
Define the multidimensional discrete distribution as having the given probabilities for each observat...