14 #ifndef MLPACK_CORE_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_HPP
15 #define MLPACK_CORE_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_HPP
22 namespace distribution {
54 probabilities(std::vector<arma::vec>(1)){ }
65 probabilities(std::vector<arma::vec>(1,
66 arma::ones<arma::vec>(numObservations) / numObservations))
79 for (
size_t i = 0; i < numObservations.n_elem; i++)
81 const size_t numObs = size_t(numObservations[i]);
84 std::ostringstream oss;
85 oss <<
"number of observations for dimension " << i <<
" is 0, but "
86 <<
"must be greater than 0";
87 throw std::invalid_argument(oss.str());
89 probabilities.push_back(arma::ones<arma::vec>(numObs) / numObs);
101 for (
size_t i = 0; i < probabilities.size(); i++)
103 arma::vec temp = probabilities[i];
104 double sum = accu(temp);
106 this->probabilities.push_back(temp / sum);
109 this->probabilities.push_back(arma::ones<arma::vec>(temp.n_elem)
130 double probability = 1.0;
132 if (observation.n_elem != probabilities.size())
134 Log::Fatal <<
"DiscreteDistribution::Probability(): observation has "
135 <<
"incorrect dimension " << observation.n_elem <<
" but should have"
136 <<
" dimension " << probabilities.size() <<
"!" << std::endl;
139 for (
size_t dimension = 0; dimension < observation.n_elem; dimension++)
143 const size_t obs = size_t(observation(dimension) + 0.5);
146 if (obs >= probabilities[dimension].n_elem)
148 Log::Fatal <<
"DiscreteDistribution::Probability(): received "
149 <<
"observation " << obs <<
"; observation must be in [0, "
150 << probabilities[dimension].n_elem <<
"] for this distribution."
153 probability *= probabilities[dimension][obs];
180 void Probability(
const arma::mat& x, arma::vec& probabilities)
const
182 probabilities.set_size(x.n_cols);
183 for (
size_t i = 0; i < x.n_cols; i++)
197 logProbabilities.set_size(x.n_cols);
198 for (
size_t i = 0; i < x.n_cols; i++)
199 logProbabilities(i) = log(
Probability(x.unsafe_col(i)));
218 void Train(
const arma::mat& observations);
229 void Train(
const arma::mat& observations,
230 const arma::vec& probabilities);
233 arma::vec&
Probabilities(
const size_t dim = 0) {
return probabilities[dim]; }
236 {
return probabilities[dim]; }
241 template<
typename Archive>
244 ar & BOOST_SERIALIZATION_NVP(probabilities);
250 std::vector<arma::vec> probabilities;
const arma::vec & Probabilities(const size_t dim=0) const
Modify the vector of probabilities for the given dimension.
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.
void LogProbability(const arma::mat &x, arma::vec &logProbabilities) const
Returns the Log probability of the given matrix.
double Probability(const arma::vec &observation) const
Return the probability of the given observation.
static MLPACK_EXPORT util::PrefixedOutStream Fatal
Prints fatal messages prefixed with [FATAL], then terminates the program.
void Probability(const arma::mat &x, arma::vec &probabilities) const
Calculates the Discrete probability density function for each data point (column) in the given matrix...
void serialize(Archive &ar, const unsigned int)
Serialize the distribution.
size_t Dimensionality() const
Get the dimensionality of the distribution.
double LogProbability(const arma::vec &observation) const
Return the log probability of the given observation.
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.
arma::vec & Probabilities(const size_t dim=0)
Return the vector of probabilities for the given dimension.
arma::vec Random() const
Return a randomly generated observation (one-dimensional vector; one observation) according to the pr...
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...