[mlpack-svn] r16725 - in mlpack/trunk/src/mlpack: methods/amf methods/amf/termination_policies methods/cf methods/nmf tests
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Thu Jun 26 20:16:06 EDT 2014
Author: sumedhghaisas
Date: Thu Jun 26 20:16:05 2014
New Revision: 16725
Log:
* Changes in AMF abstraction, Termination policy is made first template parameter
* fixed minor formatting issues
Modified:
mlpack/trunk/src/mlpack/methods/amf/CMakeLists.txt
mlpack/trunk/src/mlpack/methods/amf/amf.hpp
mlpack/trunk/src/mlpack/methods/amf/amf_impl.hpp
mlpack/trunk/src/mlpack/methods/amf/termination_policies/CMakeLists.txt
mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_residue_termination.hpp
mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_tolerance_termination.hpp
mlpack/trunk/src/mlpack/methods/cf/cf.hpp
mlpack/trunk/src/mlpack/methods/nmf/nmf_main.cpp
mlpack/trunk/src/mlpack/tests/nmf_test.cpp
Modified: mlpack/trunk/src/mlpack/methods/amf/CMakeLists.txt
==============================================================================
--- mlpack/trunk/src/mlpack/methods/amf/CMakeLists.txt (original)
+++ mlpack/trunk/src/mlpack/methods/amf/CMakeLists.txt Thu Jun 26 20:16:05 2014
@@ -17,11 +17,3 @@
add_subdirectory(update_rules)
add_subdirectory(init_rules)
add_subdirectory(termination_policies)
-
-add_executable(amf
- amf_main.cpp
-)
-target_link_libraries(amf
- mlpack
-)
-install(TARGETS amf RUNTIME DESTINATION bin)
Modified: mlpack/trunk/src/mlpack/methods/amf/amf.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/amf/amf.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/amf/amf.hpp Thu Jun 26 20:16:05 2014
@@ -1,9 +1,9 @@
/**
- * @file nmf_als.hpp
+ * @file amf.hpp
* @author Sumedh Ghaisas
*/
-#ifndef __MLPACK_METHODS_LMF_LMF_HPP
-#define __MLPACK_METHODS_LMF_LMF_HPP
+#ifndef __MLPACK_METHODS_AMF_AMF_HPP
+#define __MLPACK_METHODS_AMF_AMF_HPP
#include <mlpack/core.hpp>
#include <mlpack/methods/amf/update_rules/nmf_mult_dist.hpp>
@@ -45,9 +45,9 @@
*
* @see NMF_MultiplicativeDistanceUpdate
*/
-template<typename InitializationRule = RandomInitialization,
- typename UpdateRule = NMFMultiplicativeDistanceUpdate,
- typename TerminationPolicy = SimpleResidueTermination>
+template<typename TerminationPolicy = SimpleResidueTermination,
+ typename InitializationRule = RandomInitialization,
+ typename UpdateRule = NMFMultiplicativeDistanceUpdate>
class AMF
{
public:
@@ -68,9 +68,9 @@
* @param Update Optional UpdateRule object; for when the update rule for
* the W and H vector has states that it needs to store
*/
- AMF(const InitializationRule& initializeRule = InitializationRule(),
- const UpdateRule& update = UpdateRule(),
- const TerminationPolicy& t_policy = TerminationPolicy());
+ AMF(const TerminationPolicy& t_policy = TerminationPolicy(),
+ const InitializationRule& initializeRule = InitializationRule(),
+ const UpdateRule& update = UpdateRule());
/**
* Apply Latent Matrix Factorization to the provided matrix.
@@ -87,12 +87,12 @@
arma::mat& H);
private:
+ //! termination policy
+ TerminationPolicy t_policy;
//! Instantiated initialization Rule.
InitializationRule initializeRule;
//! Instantiated update rule.
UpdateRule update;
- //! termination policy
- TerminationPolicy t_policy;
public:
//! Access the initialization rule.
Modified: mlpack/trunk/src/mlpack/methods/amf/amf_impl.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/amf/amf_impl.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/amf/amf_impl.hpp Thu Jun 26 20:16:05 2014
@@ -1,5 +1,5 @@
/**
- * @file nmf_als.hpp
+ * @file amf_impl.hpp
* @author Sumedh Ghaisas
*/
namespace mlpack {
@@ -8,16 +8,16 @@
/**
* Construct the LMF object.
*/
-template<typename InitializationRule,
- typename UpdateRule,
- typename TerminationPolicy>
-AMF<InitializationRule, UpdateRule, TerminationPolicy>::AMF(
+template<typename TerminationPolicy,
+ typename InitializationRule,
+ typename UpdateRule>
+AMF<TerminationPolicy, InitializationRule, UpdateRule>::AMF(
+ const TerminationPolicy& t_policy,
const InitializationRule& initializeRule,
- const UpdateRule& update,
- const TerminationPolicy& t_policy) :
+ const UpdateRule& update) :
+ t_policy(t_policy),
initializeRule(initializeRule),
- update(update),
- t_policy(t_policy)
+ update(update)
{ }
/**
@@ -28,11 +28,11 @@
* @param H Encoding matrix to output
* @param r Rank r of the factorization
*/
-template<typename InitializationRule,
- typename UpdateRule,
- typename TerminationPolicy>
+template<typename TerminationPolicy,
+ typename InitializationRule,
+ typename UpdateRule>
template<typename MatType>
-double AMF<InitializationRule, UpdateRule, TerminationPolicy>::Apply(
+double AMF<TerminationPolicy, InitializationRule, UpdateRule>::Apply(
const MatType& V,
const size_t r,
arma::mat& W,
@@ -69,4 +69,3 @@
}; // namespace nmf
}; // namespace mlpack
-
Modified: mlpack/trunk/src/mlpack/methods/amf/termination_policies/CMakeLists.txt
==============================================================================
--- mlpack/trunk/src/mlpack/methods/amf/termination_policies/CMakeLists.txt (original)
+++ mlpack/trunk/src/mlpack/methods/amf/termination_policies/CMakeLists.txt Thu Jun 26 20:16:05 2014
@@ -1,8 +1,8 @@
# Define the files we need to compile
# Anything not in this list will not be compiled into MLPACK.
set(SOURCES
- simple_residue_termination.hpp
- simple_tolerance_termination.hpp
+ simple_residue_termination.hpp
+ simple_tolerance_termination.hpp
)
# Add directory name to sources.
Modified: mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_residue_termination.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_residue_termination.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_residue_termination.hpp Thu Jun 26 20:16:05 2014
@@ -1,73 +1,77 @@
+/**
+ * @file simple_residue_termination.hpp
+ * @author Sumedh Ghaisas
+ */
#ifndef _MLPACK_METHODS_AMF_SIMPLERESIDUETERMINATION_HPP_INCLUDED
#define _MLPACK_METHODS_AMF_SIMPLERESIDUETERMINATION_HPP_INCLUDED
#include <mlpack/core.hpp>
-namespace mlpack
-{
-namespace amf
-{
+namespace mlpack {
+namespace amf {
+
class SimpleResidueTermination
{
-public:
- SimpleResidueTermination(const double minResidue = 1e-10,
- const size_t maxIterations = 10000)
+ public:
+ SimpleResidueTermination(const double minResidue = 1e-10,
+ const size_t maxIterations = 10000)
: minResidue(minResidue), maxIterations(maxIterations) { }
- template<typename MatType>
- void Initialize(MatType& V)
- {
- residue = minResidue;
- iteration = 1;
- normOld = 0;
-
- const size_t n = V.n_rows;
- const size_t m = V.n_cols;
+ template<typename MatType>
+ void Initialize(MatType& V)
+ {
+ residue = minResidue;
+ iteration = 1;
+ normOld = 0;
+
+ const size_t n = V.n_rows;
+ const size_t m = V.n_cols;
+
+ nm = n * m;
+ }
+
+ bool IsConverged()
+ {
+ if(residue < minResidue || iteration > maxIterations) return true;
+ else return false;
+ }
+
+ template<typename MatType>
+ void Step(const MatType& W, const MatType& H)
+ {
+ // Calculate norm of WH after each iteration.
+ arma::mat WH;
- nm = n * m;
- }
+ WH = W * H;
+ double norm = sqrt(accu(WH % WH) / nm);
- bool IsConverged()
+ if (iteration != 0)
{
- if(residue < minResidue || iteration > maxIterations) return true;
- else return false;
+ residue = fabs(normOld - norm);
+ residue /= normOld;
}
- template<typename MatType>
- void Step(const MatType& W, const MatType& H)
- {
- // Calculate norm of WH after each iteration.
- arma::mat WH;
-
- WH = W * H;
- double norm = sqrt(accu(WH % WH) / nm);
+ normOld = norm;
- if (iteration != 0)
- {
- residue = fabs(normOld - norm);
- residue /= normOld;
- }
+ iteration++;
+ }
- normOld = norm;
+ const double& Index() { return residue; }
+ const size_t& Iteration() { return iteration; }
- iteration++;
- }
+public:
+ double minResidue;
+ size_t maxIterations;
- const double& Index() { return residue; }
- const size_t& Iteration() { return iteration; }
+ double residue;
+ size_t iteration;
+ double normOld;
-public:
- double minResidue;
- size_t maxIterations;
+ size_t nm;
+}; // class SimpleResidueTermination
- double residue;
- size_t iteration;
- double normOld;
-
- size_t nm;
-};
-}
-}
+}; // namespace amf
+}; // namespace mlpack
#endif // _MLPACK_METHODS_AMF_SIMPLERESIDUETERMINATION_HPP_INCLUDED
Modified: mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_tolerance_termination.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_tolerance_termination.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/amf/termination_policies/simple_tolerance_termination.hpp Thu Jun 26 20:16:05 2014
@@ -1,76 +1,80 @@
+/**
+ * @file simple_tolerance_termination.hpp
+ * @author Sumedh Ghaisas
+ */
#ifndef _MLPACK_METHODS_AMF_SIMPLE_TOLERANCE_TERMINATION_HPP_INCLUDED
#define _MLPACK_METHODS_AMF_SIMPLE_TOLERANCE_TERMINATION_HPP_INCLUDED
#include <mlpack/core.hpp>
-namespace mlpack
-{
-namespace amf
-{
+namespace mlpack {
+namespace amf {
+
class SimpleToleranceTermination
{
-public:
- SimpleToleranceTermination(const double tolerance = 1e-5,
- const size_t maxIterations = 10000)
+ public:
+ SimpleToleranceTermination(const double tolerance = 1e-5,
+ const size_t maxIterations = 10000)
: tolerance(tolerance), maxIterations(maxIterations) {}
- template<typename MatType>
- void Initialize(MatType& V)
- {
- residueOld = DBL_MAX;
- iteration = 1;
- normOld = 0;
- residue = DBL_MIN;
+ template<typename MatType>
+ void Initialize(MatType& V)
+ {
+ residueOld = DBL_MAX;
+ iteration = 1;
+ normOld = 0;
+ residue = DBL_MIN;
+
+ const size_t n = V.n_rows;
+ const size_t m = V.n_cols;
+
+ nm = n * m;
+ }
+
+ bool IsConverged()
+ {
+ if(((residueOld - residue) / residueOld < tolerance && iteration > 4)
+ || iteration > maxIterations) return true;
+ else return false;
+ }
+
+ template<typename MatType>
+ void Step(const MatType& W, const MatType& H)
+ {
+ // Calculate norm of WH after each iteration.
+ arma::mat WH;
- const size_t n = V.n_rows;
- const size_t m = V.n_cols;
+ WH = W * H;
+ double norm = sqrt(accu(WH % WH) / nm);
- nm = n * m;
- }
-
- bool IsConverged()
+ if (iteration != 0)
{
- if(((residueOld - residue) / residueOld < tolerance && iteration > 4) || iteration > maxIterations) return true;
- else return false;
+ residueOld = residue;
+ residue = fabs(normOld - norm);
+ residue /= normOld;
}
- template<typename MatType>
- void Step(const MatType& W, const MatType& H)
- {
- // Calculate norm of WH after each iteration.
- arma::mat WH;
-
- WH = W * H;
- double norm = sqrt(accu(WH % WH) / nm);
+ normOld = norm;
- if (iteration != 0)
- {
- residueOld = residue;
- residue = fabs(normOld - norm);
- residue /= normOld;
- }
+ iteration++;
+ }
- normOld = norm;
+ const double& Index() { return residue; }
+ const size_t& Iteration() { return iteration; }
- iteration++;
- }
+ private:
+ double tolerance;
+ size_t maxIterations;
- const double& Index() { return residue; }
- const size_t& Iteration() { return iteration; }
+ size_t iteration;
+ double residueOld;
+ double residue;
+ double normOld;
-private:
- double tolerance;
- size_t maxIterations;
-
- size_t iteration;
- double residueOld;
- double residue;
- double normOld;
-
- size_t nm;
-};
-}
-}
+ size_t nm;
+}; // class SimpleToleranceTermination
+}; // namespace amf
+}; // namespace mlpack
#endif // _MLPACK_METHODS_AMF_SIMPLE_TOLERANCE_TERMINATION_HPP_INCLUDED
Modified: mlpack/trunk/src/mlpack/methods/cf/cf.hpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/cf/cf.hpp (original)
+++ mlpack/trunk/src/mlpack/methods/cf/cf.hpp Thu Jun 26 20:16:05 2014
@@ -14,6 +14,7 @@
#include <mlpack/methods/neighbor_search/neighbor_search.hpp>
#include <mlpack/methods/amf/amf.hpp>
#include <mlpack/methods/amf/update_rules/nmf_als.hpp>
+#include <mlpack/methods/amf/termination_policies/simple_residue_termination.hpp>
#include <set>
#include <map>
#include <iostream>
@@ -54,7 +55,8 @@
* Apply(arma::sp_mat& data, size_t rank, arma::mat& W, arma::mat& H).
*/
template<
- typename FactorizerType = amf::AMF<amf::RandomInitialization,
+ typename FactorizerType = amf::AMF<amf::SimpleResidueTermination,
+ amf::RandomInitialization,
amf::NMFALSUpdate> >
class CF
{
Modified: mlpack/trunk/src/mlpack/methods/nmf/nmf_main.cpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/nmf/nmf_main.cpp (original)
+++ mlpack/trunk/src/mlpack/methods/nmf/nmf_main.cpp Thu Jun 26 20:16:05 2014
@@ -107,7 +107,7 @@
<< "rules." << std::endl;
SimpleResidueTermination srt(minResidue, maxIterations);
- AMF<> amf(RandomInitialization(), NMFMultiplicativeDistanceUpdate(), srt);
+ AMF<> amf(srt);
amf.Apply(V, r, W, H);
}
else if (updateRules == "multdiv")
@@ -115,8 +115,9 @@
Log::Info << "Performing NMF with multiplicative divergence-based update "
<< "rules." << std::endl;
SimpleResidueTermination srt(minResidue, maxIterations);
- AMF<RandomInitialization, NMFMultiplicativeDivergenceUpdate>
- amf(RandomInitialization(), NMFMultiplicativeDivergenceUpdate(), srt);
+ AMF<SimpleResidueTermination,
+ RandomInitialization,
+ NMFMultiplicativeDivergenceUpdate> amf(srt);
amf.Apply(V, r, W, H);
}
else if (updateRules == "als")
@@ -124,8 +125,9 @@
Log::Info << "Performing NMF with alternating least squared update rules."
<< std::endl;
SimpleResidueTermination srt(minResidue, maxIterations);
- AMF<RandomInitialization, NMFALSUpdate>
- amf(RandomInitialization(), NMFALSUpdate(), srt);
+ AMF<SimpleResidueTermination,
+ RandomInitialization,
+ NMFALSUpdate> amf(srt);
amf.Apply(V, r, W, H);
}
Modified: mlpack/trunk/src/mlpack/tests/nmf_test.cpp
==============================================================================
--- mlpack/trunk/src/mlpack/tests/nmf_test.cpp (original)
+++ mlpack/trunk/src/mlpack/tests/nmf_test.cpp Thu Jun 26 20:16:05 2014
@@ -56,8 +56,8 @@
const size_t r = 12;
SimpleResidueTermination srt(1e-7, 10000);
- AMF<RandomAcolInitialization<> >
- nmf(RandomAcolInitialization<>(), NMFMultiplicativeDistanceUpdate(), srt);
+ AMF<SimpleResidueTermination,RandomAcolInitialization<> >
+ nmf(srt);
nmf.Apply(v, r, w, h);
mat wh = w * h;
@@ -78,7 +78,9 @@
mat v = w * h;
size_t r = 12;
- AMF<RandomInitialization, NMFMultiplicativeDivergenceUpdate> nmf;
+ AMF<SimpleResidueTermination,
+ RandomInitialization,
+ NMFMultiplicativeDivergenceUpdate> nmf;
nmf.Apply(v, r, w, h);
mat wh = w * h;
@@ -102,8 +104,8 @@
size_t r = 12;
SimpleResidueTermination srt(1e-12, 50000);
- AMF<RandomAcolInitialization<>, NMFALSUpdate>
- nmf(RandomAcolInitialization<>(), NMFALSUpdate(), srt);
+ AMF<SimpleResidueTermination, RandomAcolInitialization<>, NMFALSUpdate>
+ nmf(srt);
nmf.Apply(v, r, w, h);
const mat wh = w * h;
@@ -143,8 +145,7 @@
size_t r = 15;
SimpleResidueTermination srt(1e-10, 10000);
- AMF<RandomAcolInitialization<> >
- nmf(RandomAcolInitialization<>(), NMFMultiplicativeDistanceUpdate(), srt);
+ AMF<SimpleResidueTermination, RandomAcolInitialization<> > nmf(srt);
const size_t seed = mlpack::math::RandInt(1000000);
mlpack::math::RandomSeed(seed); // Set random seed so results are the same.
nmf.Apply(v, r, w, h);
@@ -192,8 +193,7 @@
size_t r = 5;
SimpleResidueTermination srt(1e-10, 10000);
- AMF<RandomInitialization, NMFALSUpdate>
- nmf(RandomInitialization(), NMFALSUpdate(), srt);
+ AMF<SimpleResidueTermination, RandomInitialization, NMFALSUpdate> nmf(srt);
const size_t seed = mlpack::math::RandInt(1000000);
mlpack::math::RandomSeed(seed);
nmf.Apply(v, r, w, h);
More information about the mlpack-svn
mailing list