[mlpack-svn] r10672 - mlpack/trunk/src/mlpack/methods/radical

fastlab-svn at coffeetalk-1.cc.gatech.edu fastlab-svn at coffeetalk-1.cc.gatech.edu
Thu Dec 8 16:10:03 EST 2011


Author: niche
Date: 2011-12-08 16:10:03 -0500 (Thu, 08 Dec 2011)
New Revision: 10672

Modified:
   mlpack/trunk/src/mlpack/methods/radical/radical.cpp
   mlpack/trunk/src/mlpack/methods/radical/radical.hpp
   mlpack/trunk/src/mlpack/methods/radical/radical_main.cpp
Log:
we no longer store the data matrix matX as a class member, we changed the call to WhitenX (it is now called WhitenFeatureMajorMatrix), and added comments

Modified: mlpack/trunk/src/mlpack/methods/radical/radical.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/radical/radical.cpp	2011-12-08 19:29:03 UTC (rev 10671)
+++ mlpack/trunk/src/mlpack/methods/radical/radical.cpp	2011-12-08 21:10:03 UTC (rev 10672)
@@ -11,18 +11,29 @@
 using namespace std;
 
 
+Radical::Radical(double noiseStdDev, size_t nReplicates, size_t nAngles, 
+		 size_t nSweeps) :
+  noiseStdDev(noiseStdDev),
+  nReplicates(nReplicates),
+  nAngles(nAngles),
+  nSweeps(nSweeps),
+  m(-1)
+{
+  // nothing to do here
+}
+
 Radical::Radical(double noiseStdDev, size_t nReplicates, size_t nAngles, size_t nSweeps,
-		 const arma::mat& matX) :
+		 size_t m) :
   noiseStdDev(noiseStdDev),
   nReplicates(nReplicates),
   nAngles(nAngles),
   nSweeps(nSweeps),
-  matX(matX) 
+  m(m)
 {
-  m = floor(sqrt(matX.n_rows));
+  // nothing to do here
 }
+  
 
-
 void Radical::CopyAndPerturb(arma::mat& matXNew, const arma::mat& matX) {
   matXNew = arma::repmat(matX, nReplicates, 1);
   matXNew = matXNew + noiseStdDev * arma::randn(matXNew.n_rows, matXNew.n_cols);
@@ -68,26 +79,33 @@
 }
 
 
-void Radical::DoRadical(arma::mat& matY, arma::mat& matW) {
-
+void Radical::DoRadical(const arma::mat& matX, arma::mat& matY, arma::mat& matW) {
+  
   // matX is nPoints by nDims (although less intuitive than columns being points,
   // and although this is the transpose of the ICA literature, this choice is 
   // for computational efficiency)
   
-  size_t nDims = matX.n_cols;
+  if(m < 1) {
+    m = floor(sqrt(matX.n_rows));
+  }
   
+  
+  const size_t nDims = matX.n_cols;
+  const size_t nPoints = matX.n_rows;
+  
+  arma::mat matXWhitened;
   arma::mat matWhitening;
-  WhitenX(matWhitening);
+  WhitenFeatureMajorMatrix(matX, matXWhitened, matWhitening);
   
   // in the RADICAL code, they do not copy and perturb initially, although the
   // paper does. we follow the code as it should match their reported results
   // and likely does a better job bouncing out of local optima
   //GeneratePerturbedX(X, X);
   
-  matY = matX;
+  matY = matXWhitened;
   matW = arma::eye(nDims, nDims);
   
-  arma::mat matYSubspace(matX.n_rows, 2);
+  arma::mat matYSubspace(nPoints, 2);
   
   for(size_t sweepNum = 0; sweepNum < nSweeps; sweepNum++) {
     for(size_t i = 0; i < nDims - 1; i++) {
@@ -102,7 +120,7 @@
 	matJ(j,i) = -sin(thetaOpt);
 	matJ(j,j) = cos(thetaOpt);
 	matW = matW * matJ;
-	matY = matX * matW;
+	matY = matXWhitened * matW;
       }
     }
   }
@@ -112,10 +130,12 @@
 }
 
 
-void Radical::WhitenX(arma::mat& matWhitening) {
+void Radical::WhitenFeatureMajorMatrix(const arma::mat& matX,
+				       arma::mat& matXWhitened,
+				       arma::mat& matWhitening) {
   arma::mat matU, matV;
   arma::vec s;
   arma::svd(matU, s, matV, cov(matX));
-  matWhitening = matU * arma::diagmat(pow(s, -0.5)) * arma::trans(matV);
-  matX = matX * matWhitening;
+  matWhitening = matU * arma::diagmat(1 / sqrt(s)) * arma::trans(matV);
+  matXWhitened = matX * matWhitening;
 }

Modified: mlpack/trunk/src/mlpack/methods/radical/radical.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/radical/radical.hpp	2011-12-08 19:29:03 UTC (rev 10671)
+++ mlpack/trunk/src/mlpack/methods/radical/radical.hpp	2011-12-08 21:10:03 UTC (rev 10672)
@@ -18,29 +18,50 @@
 
 class Radical {
 public:
-  Radical(double noiseStdDev, size_t nReplicates, size_t nAngles, size_t nSweeps,
-	  const arma::mat& matX);
-
-  arma::mat X() {
-    return matX;
-  }
+  Radical(double noiseStdDev, size_t nReplicates, size_t nAngles,
+	  size_t nSweeps);
+  Radical(double noiseStdDev, size_t nReplicates, size_t nAngles,
+	  size_t nSweeps, size_t m);
   
+  //const arma::mat X() const { return matX; }
+  
   void CopyAndPerturb(arma::mat& XNew, const arma::mat& matX);
   double Vasicek(const arma::vec& x);
   double DoRadical2D(const arma::mat& matX);
-  void DoRadical(arma::mat& matY, arma::mat& matW);
+  void DoRadical(const arma::mat& matX, arma::mat& matY, arma::mat& matW);
+
+  static void WhitenFeatureMajorMatrix(const arma::mat& matX,
+				       arma::mat& matXWhitened,
+				       arma::mat& matWhitening);
   
 private:
+  /**
+   * standard deviation of the Gaussian noise added to the replicates of
+   * the data points during Radical2D
+   */
   double noiseStdDev;
+  
+  /**
+   * Number of Gaussian-perturbed replicates to use (per point) in Radical2D
+   */
   size_t nReplicates;
+  
+  /**
+   * Number of angles to consider in brute-force search during Radical2D
+   */
   size_t nAngles;
+  
+  /**
+   * Number of sweeps
+   *  - Each sweep calls Radical2D once for each pair of dimensions
+   */
   size_t nSweeps;
-  size_t m; // for Vasicek's m-spacing estimator
   
-  arma::mat matX;
+  /**
+   * m to use for Vasicek's m-spacing estimator of entropy
+   */
+  size_t m;
   
-  void WhitenX(arma::mat& matWhitening);
-  
 };
 
 #endif

Modified: mlpack/trunk/src/mlpack/methods/radical/radical_main.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/radical/radical_main.cpp	2011-12-08 19:29:03 UTC (rev 10671)
+++ mlpack/trunk/src/mlpack/methods/radical/radical_main.cpp	2011-12-08 21:10:03 UTC (rev 10672)
@@ -32,18 +32,22 @@
   //Radical rad;
   //rad.Init(0.01, 10, 200, 1, X);
 
-  Radical rad(0.01, 10, 200, 1, X);
+  Radical rad(0.01, 10, 200, 1);
 
 
   mat Y;
   mat W;
-  rad.DoRadical(Y, W);
+  rad.DoRadical(X, Y, W);
   
   W.print("W");
-
+  
+  mat matXWhitened;
+  mat matWhitening;
+  Radical::WhitenFeatureMajorMatrix(X, matXWhitened, matWhitening);
+  
   double val_init = 0;
   for(size_t i = 0; i < nDims; i++) {
-    val_init += rad.Vasicek(rad.X().col(i));
+    val_init += rad.Vasicek(matXWhitened.col(i));
   }
   printf("initial objective value: %f\n", val_init);
 




More information about the mlpack-svn mailing list