5 #ifndef COSAN_PRINCIPALCOMPONENTANALYSIS_H
6 #define COSAN_PRINCIPALCOMPONENTANALYSIS_H
15 template<Numeric NumericType>
29 ncom = std::min(ncom,RD.cols());
38 fmt::print(
"*********************************\n");
39 fmt::print(
"Begin PCA on Input Data X. Select the first {:} principal components\n",ncom);
43 Eigen::SelfAdjointEigenSolver<CosanMatrix<NumericType>> eigensolver(cov);
44 if (eigensolver.info() != Eigen::Success) {
45 throw std::invalid_argument(
"Cannot solve eigenvalue decomposition.");}
47 std::vector<NumericType>
vec(eigensolver.eigenvalues().data(), eigensolver.eigenvalues().data() + eigensolver.eigenvalues().size());
48 std::reverse(
vec.begin(),
vec.end());
49 std::vector<NumericType> runningSum(
vec.size());
50 std::partial_sum(
vec.begin(),
vec.end(), runningSum.begin());
51 for (gsl::index i =0;i<runningSum.size();i++){
52 fmt::print(
"The first {:} principal components explains {:f}% of the total variance.\n",i,runningSum[i]/runningSum.back()*100);
53 if (runningSum[i]/runningSum.back()>0.98 and i>=8){
60 fmt::print(
"Finsh PCA on Input Data X. The first {:} principal components explains {:f}% of the total variance.\n",ncom,runningSum[ncom]/runningSum.back()*100);
61 fmt::print(
"Uer .GetPC() function to get the principal components.\n" );
62 fmt::print(
"*********************************\n");
73 #endif //COSAN_PRINCIPALCOMPONENTANALYSIS_H