Tapkee
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
pca.hpp
Go to the documentation of this file.
1 /* This software is distributed under BSD 3-clause license (see LICENSE file).
2  *
3  * Copyright (c) 2012-2013 Sergey Lisitsyn
4  */
5 
6 #ifndef TAPKEE_PCA_H_
7 #define TAPKEE_PCA_H_
8 
9 /* Tapkee includes */
10 #include <tapkee/defines.hpp>
11 #include <tapkee/utils/time.hpp>
12 /* End of Tapkee includes */
13 
14 namespace tapkee
15 {
16 namespace tapkee_internal
17 {
18 
19 template <class RandomAccessIterator, class FeatureVectorCallback>
20 DenseMatrix project(const DenseMatrix& projection_matrix, const DenseVector& mean_vector,
21  RandomAccessIterator begin, RandomAccessIterator end,
22  FeatureVectorCallback callback, IndexType dimension)
23 {
24  timed_context context("Data projection");
25 
26  DenseVector current_vector(dimension);
27  DenseVector current_vector_subtracted_mean(dimension);
28 
29  DenseMatrix embedding = DenseMatrix::Zero((end-begin),projection_matrix.cols());
30 
31  for (RandomAccessIterator iter=begin; iter!=end; ++iter)
32  {
33  callback.vector(*iter,current_vector);
34  current_vector_subtracted_mean = current_vector - mean_vector;
35  embedding.row(iter-begin) = projection_matrix.transpose()*current_vector_subtracted_mean;
36  }
37 
38  return embedding;
39 }
40 
41 template <class RandomAccessIterator, class FeatureVectorCallback>
42 DenseVector compute_mean(RandomAccessIterator begin, RandomAccessIterator end,
43  FeatureVectorCallback callback, IndexType dimension)
44 {
45  DenseVector mean = DenseVector::Zero(dimension);
46  DenseVector current_vector(dimension);
47  for (RandomAccessIterator iter=begin; iter!=end; ++iter)
48  {
49  callback.vector(*iter,current_vector);
50  mean += current_vector;
51  }
52  mean.array() /= (end-begin);
53  return mean;
54 }
55 
56 template <class RandomAccessIterator, class FeatureVectorCallback>
57 DenseSymmetricMatrix compute_covariance_matrix(RandomAccessIterator begin, RandomAccessIterator end,
58  const DenseVector& mean, FeatureVectorCallback callback, IndexType dimension)
59 {
60  timed_context context("Constructing PCA covariance matrix");
61 
62  DenseSymmetricMatrix covariance_matrix = DenseSymmetricMatrix::Zero(dimension,dimension);
63 
64  DenseVector current_vector(dimension);
65  for (RandomAccessIterator iter=begin; iter!=end; ++iter)
66  {
67  callback.vector(*iter,current_vector);
68  covariance_matrix.selfadjointView<Eigen::Upper>().rankUpdate(current_vector,1.0);
69  }
70  covariance_matrix.selfadjointView<Eigen::Upper>().rankUpdate(mean,-1.0);
71 
72  return covariance_matrix;
73 }
74 
75 template <class RandomAccessIterator, class KernelCallback>
76 DenseSymmetricMatrix compute_centered_kernel_matrix(RandomAccessIterator begin, RandomAccessIterator end,
77  KernelCallback callback)
78 {
79  timed_context context("Constructing kPCA centered kernel matrix");
80 
81  DenseSymmetricMatrix kernel_matrix(end-begin,end-begin);
82 
83  for (RandomAccessIterator i_iter=begin; i_iter!=end; ++i_iter)
84  {
85  for (RandomAccessIterator j_iter=i_iter; j_iter!=end; ++j_iter)
86  {
87  ScalarType k = callback.kernel(*i_iter,*j_iter);
88  kernel_matrix(i_iter-begin,j_iter-begin) = k;
89  kernel_matrix(j_iter-begin,i_iter-begin) = k;
90  }
91  }
92 
93  centerMatrix(kernel_matrix);
94 
95  return kernel_matrix;
96 }
97 
98 } // End of namespace tapkee_internal
99 } // End of namespace tapkee
100 
101 #endif
void centerMatrix(DenseMatrix &matrix)
Definition: matrix.hpp:9
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, Eigen::Dynamic > DenseMatrix
dense matrix type (non-overridable)
Definition: types.hpp:23
DenseSymmetricMatrix compute_centered_kernel_matrix(RandomAccessIterator begin, RandomAccessIterator end, KernelCallback callback)
Definition: pca.hpp:76
DenseSymmetricMatrix compute_covariance_matrix(RandomAccessIterator begin, RandomAccessIterator end, const DenseVector &mean, FeatureVectorCallback callback, IndexType dimension)
Definition: pca.hpp:57
double ScalarType
default scalar value (can be overrided with TAPKEE_CUSTOM_INTERNAL_NUMTYPE define) ...
Definition: types.hpp:15
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, 1 > DenseVector
dense vector type (non-overridable)
Definition: types.hpp:21
int IndexType
indexing type (non-overridable) set to int for compatibility with OpenMP 2.0
Definition: types.hpp:19
DenseVector compute_mean(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback, IndexType dimension)
Definition: pca.hpp:42
DenseMatrix project(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback, IndexType dimension, const IndexType max_iter, const ScalarType epsilon, const IndexType target_dimension, const DenseVector &mean_vector)
Definition: fa.hpp:15
tapkee::DenseMatrix DenseSymmetricMatrix
dense symmetric matrix (non-overridable, currently just dense matrix, can be improved later) ...
Definition: types.hpp:25