[mlpack-svn] r10290 - in mlpack/trunk/src/mlpack/methods/hmm: . distributions
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Wed Nov 16 01:38:09 EST 2011
Author: rcurtin
Date: 2011-11-16 01:38:08 -0500 (Wed, 16 Nov 2011)
New Revision: 10290
Added:
mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.cpp
Removed:
mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution_impl.hpp
Modified:
mlpack/trunk/src/mlpack/methods/hmm/CMakeLists.txt
mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.hpp
Log:
Flesh out DiscreteDistribution class entirely. Inline functions in class
definition.
Modified: mlpack/trunk/src/mlpack/methods/hmm/CMakeLists.txt
===================================================================
--- mlpack/trunk/src/mlpack/methods/hmm/CMakeLists.txt 2011-11-15 23:24:11 UTC (rev 10289)
+++ mlpack/trunk/src/mlpack/methods/hmm/CMakeLists.txt 2011-11-16 06:38:08 UTC (rev 10290)
@@ -16,7 +16,7 @@
hmm.hpp
hmm_impl.hpp
distributions/discrete_distribution.hpp
- distributions/discrete_distribution_impl.hpp
+ distributions/discrete_distribution.cpp
)
# Add directory name to sources.
Added: mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.cpp (rev 0)
+++ mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.cpp 2011-11-16 06:38:08 UTC (rev 10290)
@@ -0,0 +1,68 @@
+/**
+ * @file discrete_distribution.cpp
+ * @author Ryan Curtin
+ *
+ * Implementation of DiscreteDistribution probability distribution.
+ */
+#include "discrete_distribution.hpp"
+
+using namespace mlpack;
+using namespace mlpack::distribution;
+
+/**
+ * Return a randomly generated observation according to the probability
+ * distribution defined by this object.
+ */
+size_t DiscreteDistribution::Random() const
+{
+ // Generate a random number.
+ double randObs = (double) rand() / (double) RAND_MAX;
+
+ double sumProb = 0;
+ for (size_t obs = 0; obs < probabilities.n_elem; obs++)
+ if ((sumProb += probabilities[obs]) >= randObs)
+ return obs;
+}
+
+/**
+ * Estimate the probability distribution directly from the given observations.
+ */
+void DiscreteDistribution::Estimate(const std::vector<size_t> observations)
+{
+ // Clear old probabilities.
+ probabilities.zeros();
+
+ // Add the probability of each observation.
+ for (std::vector<size_t>::const_iterator it = observations.begin();
+ it != observations.end(); it++)
+ probabilities(*it)++;
+
+ // Now normalize the distribution.
+ probabilities /= accu(probabilities);
+}
+
+/**
+ * Estimate the probability distribution from the given observations when also
+ * given probabilities that each observation is from this distribution.
+ */
+void DiscreteDistribution::Estimate(const std::vector<size_t> observations,
+ const std::vector<double> probObs)
+{
+ // Clear old probabilities.
+ probabilities.zeros();
+
+ // Add the probability of each observation.
+ for (size_t i = 0; i < observations.size(); i++)
+ probabilities(observations[i]) += probObs[i];
+
+ // Now normalize the distribution.
+ probabilities /= accu(probabilities);
+}
+
+/**
+ * Set the vector of probabilities correctly.
+ */
+void DiscreteDistribution::Probabilities(const arma::vec& probabilities)
+{
+ this->probabilities = probabilities / accu(probabilities);
+}
Modified: mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.hpp 2011-11-15 23:24:11 UTC (rev 10289)
+++ mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution.hpp 2011-11-16 06:38:08 UTC (rev 10290)
@@ -25,7 +25,16 @@
class DiscreteDistribution
{
public:
+ //! The type of data which this distribution uses; in our case, non-negative
+ //! integers represent observations.
+ typedef size_t DataType;
+
/**
+ * Default constructor, which creates a distribution that has no observations.
+ */
+ DiscreteDistribution() { /* nothing to do */ }
+
+ /**
* Define the discrete distribution as having numObservations possible
* observations. The probability in each state will be set to (1 /
* numObservations).
@@ -33,7 +42,8 @@
* @param numObservations Number of possible observations this distribution
* can have.
*/
- DiscreteDistribution(size_t numObservations);
+ DiscreteDistribution(size_t numObservations) : probabilities(numObservations)
+ { /* nothing to do */ }
/**
* Return the probability of the given observation. If the observation is
@@ -43,15 +53,52 @@
* @param observation Observation to return the probability of.
* @return Probability of the given observation.
*/
- double Probability(size_t observation);
+ double Probability(size_t observation) const
+ {
+ return probabilities(observation);
+ }
+ /**
+ * Return a randomly generated observation according to the probability
+ * distribution defined by this object.
+ *
+ * @return Random observation.
+ */
+ size_t Random() const;
+
+ /**
+ * Estimate the probability distribution directly from the given observations.
+ *
+ * @param observations List of observations.
+ */
+ void Estimate(const std::vector<size_t> observations);
+
+ /**
+ * Estimate the probability distribution from the given observations, taking
+ * into account the probability of each observation actually being from this
+ * distribution.
+ *
+ * @param observations List of observations.
+ * @param probabilities List of probabilities that each observation is
+ * actually from this distribution.
+ */
+ void Estimate(const std::vector<size_t> observations,
+ const std::vector<double> probabilities);
+
+ /**
+ * Return the vector of probabilities.
+ */
+ const arma::vec& Probabilities() const { return probabilities; }
+
+ /**
+ * Set the vector of probabilities correctly. The vector will be normalized.
+ */
+ void Probabilities(const arma::vec& probabilities);
+
private:
- arma::vec probability;
+ arma::vec probabilities;
};
-// Include inline implementation.
-#include "discrete_distribution_impl.hpp"
-
}; // namespace distribution
}; // namespace mlpack
Deleted: mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution_impl.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution_impl.hpp 2011-11-15 23:24:11 UTC (rev 10289)
+++ mlpack/trunk/src/mlpack/methods/hmm/distributions/discrete_distribution_impl.hpp 2011-11-16 06:38:08 UTC (rev 10290)
@@ -1,30 +0,0 @@
-/**
- * @file discrete_distribution_impl.hpp
- * @author Ryan Curtin
- *
- * Implementation of the discrete distribution.
- */
-#ifndef __MLPACK_METHODS_HMM_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_IMPL_HPP
-#define __MLPACK_METHODS_HMM_DISTRIBUTIONS_DISCRETE_DISTRIBUTION_IMPL_HPP
-
-// Just in case.
-#include "discrete_distribution.hpp"
-
-namespace mlpack {
-namespace distribution {
-
-// These functions are inlined because they are so simple.
-DiscreteDistribution::DiscreteDistribution(size_t numObservations)
- : probability(numObservations)
-{ /* nothing to do */ }
-
-inline double DiscreteDistribution::Probability(size_t observation)
-{
- // No bounds checking for speed reasons.
- return probability(observation);
-}
-
-}; // namespace distribution
-}; // namespace mlpack
-
-#endif
More information about the mlpack-svn
mailing list