Pracuję nad implementacją funkcji gęstości prawdopodobieństwa wielowymiarowego Gaussa w C++ i utknąłem na tym, jak najlepiej radzić sobie z przypadkami, w których wymiar> 2.Implementacja wielowymiarowej funkcji gęstości prawdopodobieństwa gaussowskiej dla> 2 wymiarów w C++
pDF gaussowski można zapisać jako
gdzie (a) „i a” oznacza transpozycję z «matrycą» utworzonej przez odjęcie średniej z wszystkich elementów x. W tym równaniu k jest liczbą wymiarów, które posiadamy, a sigma reprezentuje macierz kowariancji, która jest macierzą kx k. Wreszcie, | X | oznacza wyznacznik macierzy X.
W przypadku jednowymiarowym wdrożenie pdf jest banalne. Nawet w przypadku biwariatu (k = 2) jest to banalne. Jednakże, gdy przekraczamy dwa wymiary, implementacja jest znacznie trudniejsza.
w dwuwymiarowym przypadku, to mamy
gdzie Rho jest korelacja pomiędzy X i Y, z korelacji równy
W tym przypadku, może użyć Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
, aby zaimplementować pierwsze równanie, lub po prostu obliczyć wszystko za pomocą drugiego równania, bez korzystania z uproszczonego interfejsu algebry liniowej Eigen.
Moje myśli na próbę wieloczynnikowej przypadku prawdopodobnie rozpocznie rozszerzając powyższe równania do wielowymiarowej przypadku
z
moje pytania są następujące:
- Czy byłoby właściwe/zaleca się użycie
boost::multi_array
dla macierzy n-wymiarowej , czy też powinienem spróbować wykorzystać Eigen? - Czy powinienem mieć oddzielne funkcje dla przypadków jednowymiarowych/dwuwymiarowych, , czy też powinienem je po prostu skopiować do wielowymiarowego przypadku, używając boost :: multi_array (lub odpowiedniej alternatywy)?
Oof! Cóż, co próbowaliście do tej pory? : D –
Odpowiednią odpowiedzią jest oczywiście użycie biblioteki numerycznej obsługującej operacje macierzy. Czy nie zapewnia tego uBLAS/LaPack? W każdym razie użycie 'multi_array' (lub czegokolwiek self made) jest bardzo prawdopodobnie * nie * dobrym pomysłem. –