Сейчас у меня есть следующие функции для оценки гауссовских плотностей:оценить многомерную нормальную/Gaussian плотности в C++
double densities::evalMultivNorm(const Eigen::VectorXd &x, const Eigen::VectorXd &meanVec, const Eigen::MatrixXd &covMat)
{
double inv_sqrt_2pi = 0.3989422804014327;
double quadform = (x - meanVec).transpose() * covMat.inverse() * (x-meanVec);
double normConst = pow(inv_sqrt_2pi, covMat.rows()) * pow(covMat.determinant(), -.5);
return normConst * exp(-.5* quadform);
}
Это просто переписывание formula. Однако я получаю много 0, nans и infs. Я подозреваю, что это происходит от части covMat.determinant()
, которая очень близка к нулю.
Я слышал, что он более «устойчив» к премультиплексированию x-meanVec
обратным «квадратным корнем» его ковариационной матрицы. Статистически это дает вам случайный вектор, который является средним нолем и имеет единичную матрицу как свою ковариационную матрицу. Мои вопросы:
- Действительно ли это лучший способ пойти?
- Какая «лучшая» техника квадратного корня и
- Как это сделать? (Предпочтительно с использованием Eigen)