void NormalizeComponentsWhitening::train(ModelType& model, UnlabeledData<RealVector> const& input){ std::size_t dc = dataDimension(input); SHARK_CHECK(input.numberOfElements() >= dc + 1, "[NormalizeComponentsWhitening::train] input needs to contain more points than there are input dimensions"); SHARK_CHECK(m_targetVariance > 0.0, "[NormalizeComponentsWhitening::train] target variance must be positive"); // dense model with bias having input and output dimension equal to data dimension model.setStructure(dc, dc, true); RealVector mean; RealMatrix covariance; meanvar(input, mean, covariance); RealMatrix whiteningMatrix = createWhiteningMatrix(covariance); whiteningMatrix *= std::sqrt(m_targetVariance); RealVector offset = -prod(trans(whiteningMatrix),mean); model.setStructure(RealMatrix(trans(whiteningMatrix)), offset); }