J'ai un algorithme MCMC particulier que je voudrais porter en C / C ++. Une grande partie du calcul coûteux est déjà en C via Cython, mais je veux que l'échantillonneur entier soit écrit dans un langage compilé afin que je puisse simplement écrire des wrappers pour Python / R / Matlab / peu importe.
Après avoir fouillé, je me penche vers C ++. Quelques bibliothèques pertinentes que je connais sont Armadillo (http://arma.sourceforge.net/) et Scythe (http://scythe.wustl.edu/). Les deux essaient d'émuler certains aspects de R / Matlab pour faciliter la courbe d'apprentissage, ce que j'aime beaucoup. Scythe est un peu mieux avec ce que je veux faire, je pense. En particulier, son RNG comprend de nombreuses distributions où Armadillo n'a qu'un uniforme / normal, ce qui n'est pas pratique. Armadillo semble être en développement assez actif tandis que Scythe a vu sa dernière version en 2007.
Donc, ce que je me demande, c'est si quelqu'un a de l'expérience avec ces bibliothèques - ou d'autres que j'ai presque sûrement manquées - et si oui, s'il y a quelque chose à recommander l'une par rapport aux autres pour un statisticien très familier avec Python / R / Matlab mais moins avec les langages compilés (pas complètement ignorants, mais pas exactement compétents ...).
Je suggérerais fortement que vous jetiez un oeil à
RCpp
et desRcppArmadillo
packages pourR
. Fondamentalement, vous n'aurez pas à vous soucier des wrappers car ils sont déjà "inclus". De plus, le sucre syntaxique est vraiment sucré (jeu de mots).En guise de remarque secondaire, je vous recommande de jeter un œil à
JAGS
ce qui fait MCMC et son code source est en C ++.la source
Rcpp
avecRcppArmadillo
le chemin à parcourir. Edit: En utilisant Rcpp, vous avez également accès à tous les RNG implémentés dans le code C sous-jacent R.Boost Random des bibliothèques Boost C ++ pourrait vous convenir. En plus de nombreux types de RNG, il offre une variété de distributions différentes à utiliser, telles que
De plus, Boost Math complète les distributions ci-dessus à partir desquelles vous pouvez échantillonner avec de nombreuses fonctions de densité de nombreuses distributions. Il a également plusieurs fonctions d'assistance soignées; Juste pour vous donner une idée:
Si vous avez décidé d'utiliser Boost, vous pouvez également utiliser sa bibliothèque UBLAS qui propose une variété de types de matrice et d'opérations différents.
la source
Il existe de nombreuses bibliothèques C / C ++, la plupart se concentrant sur un domaine de problème particulier (par exemple les solveurs PDE). Il y a deux bibliothèques complètes auxquelles je peux penser que vous pouvez trouver particulièrement utiles car elles sont écrites en C mais ont d'excellents wrappers Python déjà écrits.
1) IMSL C et PyIMSL
2) trilinos et pytrilinos
Je n'ai jamais utilisé de trilinos car la fonctionnalité concerne principalement les méthodes d'analyse numérique, mais j'utilise beaucoup PyIMSL pour le travail statistique (et dans une vie professionnelle précédente, j'ai également développé le logiciel).
En ce qui concerne les RNG, voici ceux en C et Python en IMSL
DISCRET
DISTRIBUTIONS CONTINUES UNIVARIES
DISTRIBUTIONS CONTINUES MULTIVARIES
STATISTIQUES DE COMMANDE
PROCESSUS STOCHASTIQUES
ÉCHANTILLONS ET AUTORISATIONS
FONCTIONS UTILITAIRES
SÉQUENCE DE FAIBLE DISCRÉANCE
la source