Tengo un algoritmo MCMC particular que me gustaría portar a C / C ++. Gran parte del cálculo costoso ya está en C a través de Cython, pero quiero tener todo el muestreador escrito en un lenguaje compilado para poder escribir envoltorios para Python / R / Matlab / lo que sea.
Después de hurgar, me estoy inclinando hacia C ++. Un par de bibliotecas relevantes que conozco son Armadillo (http://arma.sourceforge.net/) y Scythe (http://scythe.wustl.edu/). Ambos intentan emular algunos aspectos de R / Matlab para facilitar la curva de aprendizaje, lo que me gusta mucho. Scythe cuadra un poco mejor con lo que quiero hacer, creo. En particular, su RNG incluye muchas distribuciones donde Armadillo solo tiene uniforme / normal, lo cual es inconveniente. Armadillo parece estar bajo un desarrollo bastante activo, mientras que Scythe vio su último lanzamiento en 2007.
Entonces, lo que me pregunto es si alguien tiene experiencia con estas bibliotecas, u otras que seguramente he extrañado, y si es así, si hay algo para recomendar una sobre las otras para un estadístico muy familiarizado con Python / R / Matlab pero menos con lenguajes compilados (no completamente ignorantes, pero no exactamente competentes ...).
Sugeriría encarecidamente que eche un vistazo
RCpp
y losRcppArmadillo
paquetes paraR
. Básicamente, no necesitará preocuparse por los envoltorios ya que ya están "incluidos". Además, el azúcar sintáctico es realmente dulce (juego de palabras).Como comentario adicional, recomendaría que eche un vistazo a
JAGS
MCMC y su código fuente está en C ++.fuente
Rcpp
conRcppArmadillo
es el camino a seguir. Editar: Usando Rcpp, también tiene acceso a todos los RNG implícitos en el código C subyacente R.Boost Random de las bibliotecas Boost C ++ podría ser una buena opción para usted. Además de muchos tipos de RNG, ofrece una variedad de distribuciones diferentes para extraer, como
Además, Boost Math complementa las distribuciones anteriores de las que puede muestrear con numerosas funciones de densidad de muchas distribuciones. También tiene varias funciones de ayuda ordenadas; solo para darte una idea:
Si decidió usar Boost, también puede usar su biblioteca UBLAS que presenta una variedad de diferentes tipos de matriz y operaciones.
fuente
Existen numerosas bibliotecas C / C ++, la mayoría centradas en un dominio de problema particular (por ejemplo, solucionadores de PDE). Se me ocurren dos bibliotecas completas que puede encontrar especialmente útiles porque están escritas en C pero tienen excelentes envoltorios de Python ya escritos.
1) IMSL C y PyIMSL
2) trilinos y pytrilinos
Nunca he usado trilinos ya que la funcionalidad se basa principalmente en métodos de análisis numérico, pero uso mucho PyIMSL para el trabajo estadístico (y en una vida laboral anterior también desarrollé el software).
Con respecto a los RNG, estos son los de C y Python en IMSL
DISCRETO
DISTRIBUCIONES CONTINUAS UNIVARIADAS
DISTRIBUCIONES CONTINUAS MULTIVARIAS
ESTADÍSTICAS DE PEDIDO
PROCESOS ESTOCÁSTICOS
MUESTRAS Y PERMUTACIONES
FUNCIONES DE UTILIDAD
SECUENCIA DE BAJA DISCREPANCIA
fuente