지금 내가 가우스 밀도 평가하기 위해 다음과 같은 기능이 있습니다는 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()
부분이 0에 매우 가깝다고 생각됩니다.
나는 공분산 행렬의 "제곱근"의 역수를 곱하여 x-meanVec
을 미리 "안정화"한다고 들었습니다. 통계적으로 이것은 평균 제로이고 공분산 행렬로서 항등 행렬을 갖는 무작위 벡터를 제공합니다. 내 질문은 다음과 같습니다.
- 정말이 방법이 가장 좋은 방법입니까?
- "최고의"제곱근 기법은 무엇입니까?
- 어떻게해야합니까? (바람직하게는 Eigen을 사용)