Estoy trabajando en la implementación de una función de densidad de probabilidad de un gaussiano multivariante en C++, y estoy atascado en cómo manejar mejor los casos donde dimensión> 2.Implementando una función de densidad de probabilidad gaussiana multivariante para> 2 dimensiones en C++
la pdf de un gaussiano se puede escribir como
donde (a) 'o a' representa la transpuesta de la 'matriz' creado por restando la media de todos los elementos de x. En esta ecuación, k es el número de dimensiones que tenemos, y sigma representa la matriz de covarianza, que es una matriz k x k. Finalmente, | X | significa el determinante de la matriz X.
En el caso univariante, implementar el pdf es trivial. Incluso en el caso bivariante (k = 2), es trivial. Sin embargo, cuando vamos más allá de dos dimensiones, la implementación es mucho más difícil.
En el caso de dos variables, tendríamos
donde rho es la correlación entre X e Y, con correlación igual a
En este caso, I podría usar Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
para implementar la primera ecuación, o simplemente calcular todo usando la segunda ecuación, sin beneficiarse de la interfaz simplificada de álgebra lineal de Eigen.
Mis pensamientos para una tentativa en el caso multivariado, probablemente comenzará mediante la extensión de las ecuaciones anteriores al caso multivariante
con
Mis preguntas son:
- ¿Sería apropiado/aconsejable usar un
boost::multi_array
para la matriz n-dimensional , o debería intentar aprovechar Eigen? - ¿Debería tener funciones separadas para los casos univariados/bivariados, o debería simplemente resumirlo todo en el caso multivariado usando boost :: multi_array (o una alternativa adecuada)?
Oof! Bueno, ¿qué has intentado hasta ahora? : D –
La respuesta adecuada aquí es, por supuesto, usar una biblioteca numérica que admita operaciones de matriz. ¿UBLAS/LaPack no proporciona esto? En cualquier caso, usar 'multi_array' (o cualquier cosa hecha a sí mismo) es muy probablemente * no * una buena idea. –