Я работаю над реализацией функции плотности вероятности многомерного гауссиана в C ++, и я застрял в том, как лучше всего справиться со случаями, когда размерность> 2.
PDF гауссова может бытьзаписывается как
, где (A) 'или A' представляет транспонирование «матрицы», созданной путем вычитания среднего из всех элементов x.В этом уравнении k - это число измерений, которое у нас есть, а сигма - ковариационная матрица, которая является матрицей akxk.Наконец, | X |означает определитель матрицы X.
В одномерном случае реализация pdf тривиальна.Даже в двумерном (k = 2) случае это тривиально.Однако, когда мы пойдем дальше двух измерений, реализация будет намного сложнее.
В двумерном случае у нас будет
, где rho - этокорреляция между x и y, с корреляцией, равной
В этом случае я мог бы использовать Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
для реализации первого уравнения или просто вычислить все сам, используя второе уравнениебез использования упрощенного интерфейса линейной алгебры Эйгена.
Мои мысли о попытке многомерного случая, вероятно, начнутся с расширения приведенных выше уравнений до многомерного случая
с
Мои вопросы:
- Было бы целесообразно / рекомендовано использовать
boost::multi_array
для n-мерного массива,или я должен вместо этого попытаться использовать Eigen? - Должны ли я иметь отдельные функции для одномерных / двумерных случаев или просто абстрагировать все это в многовариантный случай с использованием boost :: multi_array (или соответствующей альтернативы)?