[mlpack-svn] r10302 - mlpack/trunk/src/mlpack/methods/pca
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Wed Nov 16 16:17:59 EST 2011
Author: ajinkya
Date: 2011-11-16 16:17:59 -0500 (Wed, 16 Nov 2011)
New Revision: 10302
Modified:
mlpack/trunk/src/mlpack/methods/pca/pca.cpp
mlpack/trunk/src/mlpack/methods/pca/pca.hpp
mlpack/trunk/src/mlpack/methods/pca/pca_test.cpp
Log:
changed the pca api. not using Armadillo's pca anymore. Still making a few changes ..need to check-in the comments to the api.
Modified: mlpack/trunk/src/mlpack/methods/pca/pca.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/pca/pca.cpp 2011-11-16 20:16:30 UTC (rev 10301)
+++ mlpack/trunk/src/mlpack/methods/pca/pca.cpp 2011-11-16 21:17:59 UTC (rev 10302)
@@ -6,7 +6,9 @@
*/
#include "pca.hpp"
#include <mlpack/core.h>
+#include <iostream>
+using namespace std;
namespace mlpack {
namespace pca {
@@ -14,15 +16,74 @@
{
}
+void PCA::Apply(const arma::mat& data, arma::mat& transformedData,
+ arma::vec& eigVal, arma::mat& coeffs)
+{
+ arma::mat transData = trans(data);
+ arma::vec means = mean(data, 1);
+ arma::mat meanSubData = data - means * arma::ones<arma::rowvec>(data.n_cols);
+
+ arma::mat covMat = ccov(meanSubData);
+ arma::eig_sym(eigVal, coeffs, covMat);
+
+ int n_eigVal = eigVal.n_elem;
+ for(int i = 0; i < floor(n_eigVal/2); i++)
+ eigVal.swap_rows(i, (n_eigVal-1)-i);
+
+ coeffs = arma::fliplr(coeffs);
+
+ transformedData = trans(coeffs) * data;
+}
+
/**
- * Apply Armadillo's Principal Component Analysis on the data set.
+ *
*/
-void PCA::Apply(const arma::mat& data, arma::mat& coeff, arma::mat& score)
+void PCA::Apply(const arma::mat& data, arma::mat& transformedData,
+ arma::vec& eigVal)
{
- //Armadillo's PCA api
- arma::princomp(coeff, score, arma::trans(data));
+ arma::mat transData = trans(data);
+ arma::vec means = mean(data, 1);
+ arma::mat meanSubData = data - means * arma::ones<arma::rowvec>(data.n_cols);
+
+ arma::mat covMat = ccov(meanSubData);
+ arma::mat eigVec;
+ arma::eig_sym(eigVal, eigVec, covMat);
+
+ int n_eigVal = eigVal.n_elem;
+ for(int i = 0; i < floor(n_eigVal/2); i++)
+ eigVal.swap_rows(i, (n_eigVal-1)-i);
+
+ eigVec = arma::fliplr(eigVec);
+
+ transformedData = trans(eigVec) * data;
}
+void PCA::Apply(arma::mat& data, const int newDimension)
+{
+ arma::mat transData = trans(data);
+ arma::vec means = mean(data, 1);
+ arma::mat meanSubData = data - means * arma::ones<arma::rowvec>(data.n_cols);
+
+ arma::mat covMat = ccov(meanSubData);
+ arma::mat eigVec;
+ arma::vec eigVal;
+ arma::eig_sym(eigVal, eigVec, covMat);
+
+ int n_eigVal = eigVal.n_elem;
+ for(int i = 0; i < floor(n_eigVal/2); i++)
+ eigVal.swap_rows(i, (n_eigVal-1)-i);
+
+ eigVec = arma::fliplr(eigVec);
+
+ eigVec.shed_cols(newDimension, eigVec.n_cols - 1);
+ cout << eigVec << endl;
+ cout << data << endl;
+
+ data = trans(eigVec) * data;
+
+ cout << data << endl;
+}
+
PCA::~PCA()
{
}
Modified: mlpack/trunk/src/mlpack/methods/pca/pca.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/pca/pca.hpp 2011-11-16 20:16:30 UTC (rev 10301)
+++ mlpack/trunk/src/mlpack/methods/pca/pca.hpp 2011-11-16 21:17:59 UTC (rev 10302)
@@ -20,8 +20,19 @@
* @param coeff - PCA Loadings
* @param score - contains the coordinates of the original data in the new coordinate system defined by the principal components
*/
- void Apply(const arma::mat& data, arma::mat& coeff, arma::mat& score);
+ void Apply(arma::mat& data, const int newDimension);
+ void Apply(const arma::mat& data, arma::mat& transformedData,
+ arma::vec& eigVal);
+ void Apply(const arma::mat& data, arma::mat& transformedData, arma::vec&
+ eigVal, arma::mat& coeffs);
+
+ /*
+
+
+ // And for someone who wants even more.
+ ;*/
+
/**
* Delete PCA object
*/
Modified: mlpack/trunk/src/mlpack/methods/pca/pca_test.cpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/pca/pca_test.cpp 2011-11-16 20:16:30 UTC (rev 10301)
+++ mlpack/trunk/src/mlpack/methods/pca/pca_test.cpp 2011-11-16 21:17:59 UTC (rev 10302)
@@ -40,11 +40,11 @@
//MLPACK data set is organized with rows as attributes and columns as data
//points. Hence the need to transpose the matrix before applying Armadillo's
//princomp PCA api
- mat trans_data = arma::trans(data);
+ //mat trans_data = arma::trans(data);
mlpack::pca::PCA p;
- p.Apply(trans_data, coeff, score);
+ p.Apply(data, 2);
- n_rows = data.n_rows;
+ /*n_rows = data.n_rows;
n_cols = data.n_cols;
//verify the PCA results based on the loadings(coeff matrix) and the score
@@ -55,7 +55,7 @@
assert(fabs(coeff_actual(i, j) - coeff(i, j)) < 0.0001);
assert(fabs(score_actual(i, j) - score(i, j)) < 0.0001);
}
- }
+ }*/
return 0;
}
More information about the mlpack-svn
mailing list