LDL matrix decomposition, see http://en.wikipedia.org/wiki/Cholesky_decomposition#LDL_decomposition_2
| 195 | namespace { |
| 196 | // LDL matrix decomposition, see http://en.wikipedia.org/wiki/Cholesky_decomposition#LDL_decomposition_2 |
| 197 | bool LDLDecomposition(const TVector<double>& linearizedOLSMatrix, |
| 198 | const double regularizationThreshold, |
| 199 | const double regularizationParameter, |
| 200 | TVector<double>& decompositionTrace, |
| 201 | TVector<TVector<double>>& decompositionMatrix) { |
| 202 | const size_t featuresCount = decompositionTrace.size(); |
| 203 | |
| 204 | size_t olsMatrixElementIdx = 0; |
| 205 | for (size_t rowNumber = 0; rowNumber < featuresCount; ++rowNumber) { |
| 206 | double& decompositionTraceElement = decompositionTrace[rowNumber]; |
| 207 | decompositionTraceElement = linearizedOLSMatrix[olsMatrixElementIdx] + regularizationParameter; |
| 208 | |
| 209 | TVector<double>& decompositionRow = decompositionMatrix[rowNumber]; |
| 210 | for (size_t i = 0; i < rowNumber; ++i) { |
| 211 | decompositionTraceElement -= decompositionRow[i] * decompositionRow[i] * decompositionTrace[i]; |
| 212 | } |
| 213 | |
| 214 | if (fabs(decompositionTraceElement) < regularizationThreshold) { |
| 215 | return false; |
| 216 | } |
| 217 | |
| 218 | ++olsMatrixElementIdx; |
| 219 | decompositionRow[rowNumber] = 1.; |
| 220 | for (size_t columnNumber = rowNumber + 1; columnNumber < featuresCount; ++columnNumber) { |
| 221 | TVector<double>& secondDecompositionRow = decompositionMatrix[columnNumber]; |
| 222 | double& decompositionMatrixElement = secondDecompositionRow[rowNumber]; |
| 223 | |
| 224 | decompositionMatrixElement = linearizedOLSMatrix[olsMatrixElementIdx]; |
| 225 | |
| 226 | for (size_t j = 0; j < rowNumber; ++j) { |
| 227 | decompositionMatrixElement -= decompositionRow[j] * secondDecompositionRow[j] * decompositionTrace[j]; |
| 228 | } |
| 229 | |
| 230 | decompositionMatrixElement /= decompositionTraceElement; |
| 231 | |
| 232 | decompositionRow[columnNumber] = decompositionMatrixElement; |
| 233 | ++olsMatrixElementIdx; |
| 234 | } |
| 235 | } |
| 236 | |
| 237 | return true; |
| 238 | } |
| 239 | |
| 240 | void LDLDecomposition(const TVector<double>& linearizedOLSMatrix, |
| 241 | TVector<double>& decompositionTrace, |