37 #ifndef SHARK_ALGORITHMS_TRAINERS_NORMALIZECOMPONENTSWHITENING_H 38 #define SHARK_ALGORITHMS_TRAINERS_NORMALIZECOMPONENTSWHITENING_H 57 SHARK_CHECK(targetVariance > 0.0,
"[NormalizeComponentsWhitening::NormalizeComponentsWhitening] target variance must be positive");
58 m_targetVariance = targetVariance;
63 {
return "NormalizeComponentsWhitening"; }
67 SHARK_CHECK(input.
numberOfElements() >= dc + 1,
"[NormalizeComponentsWhitening::train] input needs to contain more points than there are input dimensions");
68 SHARK_CHECK(m_targetVariance > 0.0,
"[NormalizeComponentsWhitening::train] target variance must be positive");
75 meanvar(input, mean, covariance);
77 RealMatrix whiteningMatrix = createWhiteningMatrix(covariance);
78 whiteningMatrix *= std::sqrt(m_targetVariance);
80 RealVector offset = -
prod(
trans(whiteningMatrix),mean);
86 RealMatrix createWhiteningMatrix(
91 SIZE_CHECK(covariance.size1() == covariance.size2());
92 std::size_t m = covariance.size1();
96 RealMatrix whiteningMatrix(m,m,0.0);
103 matrix_range<RealMatrix> C =
columns(covariance,0,rank);
109 solveTriangularSystemInPlace<SolveXAB,upper>(
trans(C),whiteningMatrix);
111 return whiteningMatrix;
117 RealMatrix CTC(rank,rank);
120 matrix_range<RealMatrix> submat =
columns(whiteningMatrix,0,rank);
121 solveSymmPosDefSystem<SolveXAB>(CTC,submat,C);
124 return whiteningMatrix;