[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