Advertisement
Guest User

Untitled

a guest
Jul 7th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. /**
  2.  * @file exact_svd_method.hpp
  3.  * @author Ajinkya Kale
  4.  * @author Ryan Curtin
  5.  * @author Marcus Edel
  6.  *
  7.  * Implementation of the exact svd method for use in the Principal Components
  8.  * Analysis method.
  9.  */
  10.  
  11. #ifndef MLPACK_METHODS_PCA_DECOMPOSITION_POLICIES_ITERATIVE_PCA_METHOD_HPP
  12. #define MLPACK_METHODS_PCA_DECOMPOSITION_POLICIES_ITERATIVE_PCA_METHOD_HPP
  13.  
  14. #include <mlpack/core.hpp>
  15.  
  16. #include <chrono>
  17.  
  18. namespace mlpack {
  19. namespace pca {
  20.  
  21. /**
  22.  * Implementation of the iterative PCA policy.
  23.  */
  24. class IterativePCAPolicy
  25. {
  26. public:
  27.   /**
  28.    * @param dimension desired dimension of the transformed data
  29.    * @param iterateTime upper bound iteration times of each eigen vector
  30.    */
  31.  
  32.   explicit IterativePCAPolicy(size_t dimension, size_t iterateTime = 50) :
  33.       dimension(dimension),
  34.       iterateTime(iterateTime)
  35.   {}
  36.  
  37.   /**
  38.    * Apply Iterative PCA to the provided data set using the
  39.    * exact SVD method.
  40.    *
  41.    * @param data Data matrix.
  42.    * @param centeredData Centered data matrix.
  43.    * @param transformedData Matrix to put results of PCA into.
  44.    * @param eigVal Vector to put eigenvalues into.
  45.    * @param eigvec Matrix to put eigenvectors (loadings) into.
  46.    * @param rank Rank of the decomposition.
  47.    */
  48.   void Apply(const arma::mat& /* data */,
  49.              const arma::mat& centeredData,
  50.              arma::mat& transformedData,
  51.              arma::vec& /* eigval */,
  52.              arma::mat& eigvec,
  53.              const size_t /* rank */)
  54.   {
  55.     std::chrono::time_point<std::chrono::system_clock> start, end;
  56.     start = std::chrono::system_clock::now();
  57.     const arma::mat covMat = arma::cov(arma::trans(centeredData));
  58.     end = std::chrono::system_clock::now();
  59.     std::cout<<"covMat elapsed : "<<
  60.                std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()<<std::endl;
  61.  
  62.     start = std::chrono::system_clock::now();
  63.     eigvec = arma::randu<arma::mat>(covMat.n_rows, dimension);
  64.     end = std::chrono::system_clock::now();
  65.     std::cout<<"randu elapsed : "<<
  66.                std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()<<std::endl;
  67.  
  68.     start = std::chrono::system_clock::now();
  69.     GramSchmidtIter(covMat, eigvec);
  70.     end = std::chrono::system_clock::now();
  71.     std::cout<<"GramSchmidtIter elapsed : "<<
  72.                std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()<<std::endl;
  73.  
  74.     start = std::chrono::system_clock::now();
  75.     transformedData = arma::trans(eigvec) * centeredData;
  76.     end = std::chrono::system_clock::now();
  77.     std::cout<<"transformedData elapsed : "<<
  78.                std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()<<std::endl;
  79.   }
  80.  
  81.   void Dimension(size_t dimension)
  82.   {
  83.     dimension = dimension;
  84.   }
  85.  
  86.   size_t Dimension()
  87.   {
  88.     return dimension;
  89.   }
  90.  
  91.   size_t Dimension() const
  92.   {
  93.     return dimension;
  94.   }
  95.  
  96.   void IterateTime(size_t iterateTime)
  97.   {
  98.     iterateTime = iterateTime;
  99.   }
  100.  
  101.   size_t IterateTime()
  102.   {
  103.     return iterateTime;
  104.   }
  105.  
  106.   size_t IterateTime() const
  107.   {
  108.     return iterateTime;
  109.   }
  110.  
  111. private:
  112.   void GramSchmidtIter(const arma::mat &covMat, arma::mat &eigvec) const
  113.   {
  114.     arma::mat temp(eigvec.n_rows, 1);
  115.     arma::mat innerProd;
  116.     for(size_t i = 0; i != dimension; ++i)
  117.     {
  118.       size_t iterate = 0;
  119.       do{
  120.         temp.zeros();
  121.         eigvec.col(i) = covMat * eigvec.col(i);
  122.         const arma::mat eivecTrans = arma::trans(eigvec.col(i));
  123.         for(size_t j = 0; j <= i; ++j){
  124.           innerProd = eivecTrans * eigvec.col(j);
  125.           temp += innerProd(0) * eigvec.col(j);
  126.         }
  127.         //const arma::mat temp = arma::repmat(arma::trans(eigvec.col(i)), i + 1, 1) *
  128.         //    eigvec.submat(0,0,eigvec.n_rows-1, i);
  129.         eigvec.col(i) -= temp;
  130.         eigvec.col(i) /= std::sqrt(arma::sum(eigvec.col(i) % eigvec.col(i)));
  131.         ++iterate;
  132.       }while(iterate < iterateTime);
  133.     }
  134.   }
  135.  
  136.   size_t dimension;
  137.   size_t iterateTime;
  138. };
  139.  
  140. } // namespace pca
  141. } // namespace mlpack
  142.  
  143. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement