mlpack 3.4.2
Loading...
Searching...
No Matches
nystroem_method.hpp
Go to the documentation of this file.
1
13#ifndef MLPACK_METHODS_KERNEL_PCA_NYSTROEM_METHOD_HPP
14#define MLPACK_METHODS_KERNEL_PCA_NYSTROEM_METHOD_HPP
15
16#include <mlpack/prereqs.hpp>
19
20namespace mlpack {
21namespace kpca {
22
23template<
24 typename KernelType,
25 typename PointSelectionPolicy = kernel::KMeansSelection<>
26>
28{
29 public:
40 static void ApplyKernelMatrix(const arma::mat& data,
41 arma::mat& transformedData,
42 arma::vec& eigval,
43 arma::mat& eigvec,
44 const size_t rank,
45 KernelType kernel = KernelType())
46 {
47 arma::mat G, v;
49 rank);
50 nm.Apply(G);
51 transformedData = G.t() * G;
52
53 // Center the reconstructed approximation.
54 math::Center(transformedData, transformedData);
55
56 // For PCA the data has to be centered, even if the data is centered. But
57 // it is not guaranteed that the data, when mapped to the kernel space, is
58 // also centered. Since we actually never work in the feature space we
59 // cannot center the data. So, we perform a "psuedo-centering" using the
60 // kernel matrix.
61 arma::colvec colMean = arma::sum(G, 1) / G.n_rows;
62 G.each_row() -= arma::sum(G, 0) / G.n_rows;
63 G.each_col() -= colMean;
64 G += arma::sum(colMean) / G.n_rows;
65
66 // Eigendecompose the centered kernel matrix.
67 transformedData = arma::symmatu(transformedData);
68 if (!arma::eig_sym(eigval, eigvec, transformedData))
69 {
70 Log::Fatal << "Failed to construct the kernel matrix." << std::endl;
71 }
72
73 // Swap the eigenvalues since they are ordered backwards (we need largest
74 // to smallest).
75 for (size_t i = 0; i < floor(eigval.n_elem / 2.0); ++i)
76 eigval.swap_rows(i, (eigval.n_elem - 1) - i);
77
78 // Flip the coefficients to produce the same effect.
79 eigvec = arma::fliplr(eigvec);
80
81 transformedData = eigvec.t() * G.t();
82 }
83};
84
85} // namespace kpca
86} // namespace mlpack
87
88#endif
static MLPACK_EXPORT util::PrefixedOutStream Fatal
Prints fatal messages prefixed with [FATAL], then terminates the program.
Definition: log.hpp:90
void Apply(arma::mat &output)
Apply the low-rank factorization to obtain an output matrix G such that K' = G * G^T.
static void ApplyKernelMatrix(const arma::mat &data, arma::mat &transformedData, arma::vec &eigval, arma::mat &eigvec, const size_t rank, KernelType kernel=KernelType())
Construct the kernel matrix approximation using the nystroem method.
void Center(const arma::mat &x, arma::mat &xCentered)
Creates a centered matrix, where centering is done by subtracting the sum over the columns (a column ...
Linear algebra utility functions, generally performed on matrices or vectors.
The core includes that mlpack expects; standard C++ includes and Armadillo.