[mlpack-svn] r10909 - mlpack/trunk/src/mlpack/methods/kernel_pca
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Tue Dec 20 12:07:13 EST 2011
Author: ajinkya
Date: 2011-12-20 12:07:13 -0500 (Tue, 20 Dec 2011)
New Revision: 10909
Modified:
mlpack/trunk/src/mlpack/methods/kernel_pca/kernel_pca_impl.hpp
Log:
kernel pca works with linear Kernel now.
Modified: mlpack/trunk/src/mlpack/methods/kernel_pca/kernel_pca_impl.hpp
===================================================================
--- mlpack/trunk/src/mlpack/methods/kernel_pca/kernel_pca_impl.hpp 2011-12-20 16:31:12 UTC (rev 10908)
+++ mlpack/trunk/src/mlpack/methods/kernel_pca/kernel_pca_impl.hpp 2011-12-20 17:07:13 UTC (rev 10909)
@@ -1,30 +1,25 @@
/**
- * @file kernelpca_impl.hpp
+ * @file kernel_pca_impl.hpp
* @author Ajinkya Kale
*
- * Implementation of KernelPCA class to perform Kernel Principal Components
- * Analysis on the specified data set.
+ * Implementation of KPCA class to perform Kernel Principal Components Analysis on the
+ * specified data set.
*/
-#ifndef __MLPACK_METHODS_KERNEL_PCA_KERNEL_PCA_IMPL_HPP
-#define __MLPACK_METHODS_KERNEL_PCA_KERNEL_PCA_IMPL_HPP
-
-// In case it hasn't already been included.
-#include "kernel_pca.hpp"
-
+#include "kpca.hpp"
#include <iostream>
+#include <cmath>
-using namespace std; // This'll have to go before the release.
-
+using namespace std;
namespace mlpack {
namespace kpca {
template <typename KernelType>
-KernelPCA<KernelType>::KernelPCA(const KernelType kernel,
+KPCA<KernelType>::KPCA(const KernelType kernel,
const bool centerData,
const bool scaleData) :
- kernel(kernel),
- centerData(centerData),
- scaleData(scaleData)
+ kernel_(kernel),
+ centerData_(centerData),
+ scaleData_(scaleData)
{
}
@@ -32,80 +27,50 @@
* Apply Kernel Principal Component Analysis to the provided data set.
*
* @param data - Data matrix
- * @param transformedData - Data with KernelPCA applied
+ * @param transformedData - Data with KPCA applied
* @param eigVal - contains eigen values in a column vector
- * @param coeff - KernelPCA Loadings/Coeffs/EigenVectors
+ * @param coeff - KPCA Loadings/Coeffs/EigenVectors
*/
template <typename KernelType>
-void KernelPCA<KernelType>::Apply(const arma::mat& data,
- arma::mat& transformedData,
- arma::vec& eigVal,
- arma::mat& coeffs)
+void KPCA<KernelType>::Apply(const arma::mat& data, arma::mat& transformedData,
+ arma::vec& eigVal, arma::mat& coeffs)
{
arma::mat transData = trans(data);
- if (centerData)
+ if(centerData_)
{
arma::rowvec means = arma::mean(transData, 0);
transData = transData - arma::ones<arma::colvec>(transData.n_rows) * means;
- cout << "centering data" << endl;
}
- transData.print("TRANSDATA");
arma::mat centeredData = trans(transData);
+ arma::mat kernelMat = GetKernelMatrix(kernel_, centeredData);
+ arma::eig_sym(eigVal, coeffs, kernelMat);
- arma::mat kernelMat(centeredData.n_rows, centeredData.n_rows);
+ int n_eigVal = eigVal.n_elem;
+ for(int i = 0; i < floor(n_eigVal / 2); i++)
+ eigVal.swap_rows(i, (n_eigVal - 1) - i);
- for (size_t i = 0; i < centeredData.n_rows; i++)
- {
- for (size_t j = 0; j < centeredData.n_rows; j++)
- {
- arma::vec v1 = trans(centeredData.row(i));
- arma::vec v2 = trans(centeredData.row(j));
- kernelMat(i, j) = kernel.Evaluate(v1, v2);
- }
- }
-
- kernelMat.print("KERNEL MATRIX : ");
- arma::mat matCov = (cov(centeredData));
- matCov.print("COV MATRIX : ");
-
- transData = kernelMat; // Use the kernel matrix to do the transformations
- // after this point.
-
- if (scaleData)
- {
- transData = transData / (arma::ones<arma::colvec>(transData.n_rows) *
- stddev(transData, 0, 0));
- }
-
- arma::mat covMat = cov(transData);
- arma::eig_sym(eigVal, coeffs, covMat);
-
- int nEigVal = eigVal.n_elem;
- for(int i = 0; i < floor(nEigVal / 2); i++)
- eigVal.swap_rows(i, (nEigVal - 1) - i);
-
coeffs = arma::fliplr(coeffs);
+
transformedData = trans(coeffs) * data;
arma::colvec transformedDataMean = arma::mean(transformedData, 1);
- transformedData = transformedData - (transformedDataMean *
- arma::ones<arma::rowvec>(transformedData.n_cols));
+ transformedData = transformedData - (transformedDataMean * arma::ones<arma::rowvec>(transformedData.n_cols));
}
/**
* Apply Kernel Principal Component Analysis to the provided data set.
*
* @param data - Data matrix
- * @param transformedData - Data with KernelPCA applied
+ * @param transformedData - Data with KPCA applied
* @param eigVal - contains eigen values in a column vector
*/
template <typename KernelType>
-void KernelPCA<KernelType>::Apply(const arma::mat& data,
- arma::mat& transformedData,
- arma::vec& eigVal)
+void KPCA<KernelType>::Apply(const arma::mat& data, arma::mat& transformedData,
+ arma::vec& eigVal)
{
arma::mat coeffs;
- Apply(data, transformedData, eigVal, coeffs);
+ Apply(data, transformedData,
+ eigVal, coeffs);
}
/**
@@ -119,18 +84,38 @@
* coeff/eigen vector matrix with only newDimension number of columns chosen.
*/
template <typename KernelType>
-void KernelPCA<KernelType>::Apply(arma::mat& data, const size_t newDimension)
+void KPCA<KernelType>::Apply(arma::mat& data, const int newDimension)
{
arma::mat coeffs;
arma::vec eigVal;
Apply(data, data, eigVal, coeffs);
- if (newDimension < coeffs.n_rows && newDimension > 0)
+ if(newDimension < coeffs.n_rows && newDimension > 0)
data.shed_rows(newDimension, data.n_rows - 1);
}
+/*template <typename KernelType>
+KPCA<KernelType>::~KPCA()
+{
+}*/
+
}; // namespace mlpack
}; // namespace kpca
-#endif
+template <typename KernelType>
+arma::mat GetKernelMatrix(KernelType kernel, arma::mat transData)
+{
+ arma::mat kernelMat(transData.n_rows, transData.n_rows);
+
+ for(int i = 0; i < transData.n_rows; i++)
+ {
+ for(int j = 0; j < transData.n_rows; j++)
+ {
+ arma::vec v1 = trans(transData.row(i));
+ arma::vec v2 = trans(transData.row(j));
+ kernelMat(i, j) = kernel.Evaluate(v1, v2);
+ }
+ }
+ return kernelMat;
+}
More information about the mlpack-svn
mailing list