/usr/include/mlpack/methods/kernel_pca/kernel_rules/nystroem_method.hpp is in libmlpack-dev 1.0.10-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | /**
* @file nystroem_method.hpp
* @author Marcus Edel
*
* Use the Nystroem method for approximating a kernel matrix.
*
* This file is part of MLPACK 1.0.10.
*
* MLPACK is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* MLPACK is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details (LICENSE.txt).
*
* You should have received a copy of the GNU General Public License along with
* MLPACK. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __MLPACK_METHODS_KERNEL_PCA_NYSTROEM_METHOD_HPP
#define __MLPACK_METHODS_KERNEL_PCA_NYSTROEM_METHOD_HPP
#include <mlpack/core.hpp>
#include <mlpack/methods/nystroem_method/kmeans_selection.hpp>
#include <mlpack/methods/nystroem_method/nystroem_method.hpp>
namespace mlpack {
namespace kpca {
template<
typename KernelType,
typename PointSelectionPolicy = kernel::KMeansSelection<>
>
class NystroemKernelRule
{
public:
/**
* Construct the kernel matrix approximation using the nystroem method.
*
* @param data Input data points.
* @param transformedData Matrix to output results into.
* @param eigval KPCA eigenvalues will be written to this vector.
* @param eigvec KPCA eigenvectors will be written to this matrix.
* @param rank Rank to be used for matrix approximation.
* @param kernel Kernel to be used for computation.
*/
static void ApplyKernelMatrix(const arma::mat& data,
arma::mat& transformedData,
arma::vec& eigval,
arma::mat& eigvec,
const size_t rank,
KernelType kernel = KernelType())
{
arma::mat G, v;
kernel::NystroemMethod<KernelType, PointSelectionPolicy> nm(data, kernel,
rank);
nm.Apply(G);
transformedData = G.t() * G;
// For PCA the data has to be centered, even if the data is centered. But
// it is not guaranteed that the data, when mapped to the kernel space, is
// also centered. Since we actually never work in the feature space we
// cannot center the data. So, we perform a "psuedo-centering" using the
// kernel matrix.
arma::rowvec rowMean = arma::sum(transformedData, 0) /
transformedData.n_cols;
transformedData.each_col() -= arma::sum(transformedData, 1) /
transformedData.n_cols;
transformedData.each_row() -= rowMean;
transformedData += arma::sum(rowMean) / transformedData.n_cols;
// Eigendecompose the centered kernel matrix.
arma::svd(eigvec, eigval, v, transformedData);
eigval %= eigval / (data.n_cols - 1);
transformedData = eigvec.t() * G.t();
}
};
}; // namespace kpca
}; // namespace mlpack
#endif
|