MLPACK  1.0.11
nystroem_method.hpp
Go to the documentation of this file.
1 
23 #ifndef __MLPACK_METHODS_KERNEL_PCA_NYSTROEM_METHOD_HPP
24 #define __MLPACK_METHODS_KERNEL_PCA_NYSTROEM_METHOD_HPP
25 
26 #include <mlpack/core.hpp>
29 
30 namespace mlpack {
31 namespace kpca {
32 
33 template<
34  typename KernelType,
35  typename PointSelectionPolicy = kernel::KMeansSelection<>
36 >
38 {
39  public:
50  static void ApplyKernelMatrix(const arma::mat& data,
51  arma::mat& transformedData,
52  arma::vec& eigval,
53  arma::mat& eigvec,
54  const size_t rank,
55  KernelType kernel = KernelType())
56  {
57  arma::mat G, v;
59  rank);
60  nm.Apply(G);
61  transformedData = G.t() * G;
62 
63  // For PCA the data has to be centered, even if the data is centered. But
64  // it is not guaranteed that the data, when mapped to the kernel space, is
65  // also centered. Since we actually never work in the feature space we
66  // cannot center the data. So, we perform a "psuedo-centering" using the
67  // kernel matrix.
68  arma::rowvec rowMean = arma::sum(transformedData, 0) /
69  transformedData.n_cols;
70  transformedData.each_col() -= arma::sum(transformedData, 1) /
71  transformedData.n_cols;
72  transformedData.each_row() -= rowMean;
73  transformedData += arma::sum(rowMean) / transformedData.n_cols;
74 
75  // Eigendecompose the centered kernel matrix.
76  arma::svd(eigvec, eigval, v, transformedData);
77  eigval %= eigval / (data.n_cols - 1);
78 
79  transformedData = eigvec.t() * G.t();
80  }
81 };
82 
83 }; // namespace kpca
84 }; // namespace mlpack
85 
86 #endif