У меня есть определенный алгоритм MCMC, который я хотел бы перенести на C / C ++. Большая часть дорогостоящих вычислений выполняется на C уже через Cython, но я хочу, чтобы весь сэмплер был написан на скомпилированном языке, чтобы я мог просто писать оболочки для Python / R / Matlab / что угодно.
После осмотра я склоняюсь к C ++. Я знаю несколько соответствующих библиотек: Armadillo (http://arma.sourceforge.net/) и Scythe (http://scythe.wustl.edu/). Оба пытаются подражать некоторым аспектам R / Matlab, чтобы облегчить процесс обучения, что мне очень нравится. Я думаю, что косы немного лучше, чем я хочу. В частности, его RNG включает в себя множество дистрибутивов, где Armadillo имеет только равномерное / нормальное, что неудобно. Armadillo, кажется, находится в стадии довольно активной разработки, в то время как Scythe выпустила свой последний релиз в 2007 году.
Так что мне интересно, есть ли у кого-то опыт работы с этими библиотеками - или с другими, которые я почти наверняка пропустил - и если да, то есть ли что-то, что можно было бы порекомендовать одному из других для статистика, хорошо знакомого с Python / R / Matlab но не так с скомпилированными языками (не совсем невежественными, но не совсем опытными ...).
Я бы настоятельно рекомендую вам взглянуть на
RCpp
иRcppArmadillo
пакеты дляR
. По сути, вам не нужно беспокоиться об оболочках, так как они уже включены. Кроме того, синтаксический сахар действительно сладкий (каламбур).В качестве побочного замечания я бы порекомендовал вам взглянуть
JAGS
, что делает MCMC и его исходный код находится на C ++.источник
Rcpp
сRcppArmadillo
это путь. Редактировать: Используя Rcpp, у вас также есть доступ ко всем ГСЧ, включенным в C-код, лежащий в основе R.Boost Random из библиотек Boost C ++ может подойти вам. В дополнение ко многим типам RNG, он предлагает множество различных распределений, таких как:
Кроме того, Boost Math дополняет вышеприведенные распределения, из которых можно выполнить выборку, множеством функций плотности многих распределений. Он также имеет несколько полезных вспомогательных функций; просто чтобы дать вам представление:
Если вы решили использовать Boost, вы также можете использовать его библиотеку UBLAS, которая содержит множество различных типов матриц и операций.
источник
Существует множество библиотек C / C ++, большинство из которых сосредоточено на конкретной проблемной области (например, решатели PDE). Я могу подумать, что есть две всеобъемлющие библиотеки, которые могут оказаться особенно полезными, поскольку они написаны на C, но уже имеют отличные оболочки Python.
1) IMSL C и PyIMSL
2) трилино и питрилино
Я никогда не использовал трилино, так как функциональность в основном связана с методами численного анализа, но я часто использую PyIMSL для статистической работы (и в предыдущей жизни я тоже разрабатывал программное обеспечение).
Что касается RNG, вот те, в C и Python в IMSL
DISCRETE
УНИВЕРСАЛЬНЫЕ НЕПРЕРЫВНЫЕ РАСПРЕДЕЛЕНИЯ
МНОГОМЕРНЫЕ НЕПРЕРЫВНЫЕ РАСПРЕДЕЛЕНИЯ
СТАТИСТИКА ЗАКАЗА
СТОХАСТИЧЕСКИЕ ПРОЦЕССЫ
ОБРАЗЦЫ И ГЕРМЕТИКИ
ПОЛЕЗНЫЕ ФУНКЦИИ
НИЗКАЯ РАСПРОСТРАНЕННОСТЬ
источник