[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