Поддержка Numba для больших целых чисел? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть таблица поиска факториала, которая содержит первые 30 целочисленных факториалов.Эта таблица используется в функции, которая компилируется с numba.njit.Проблема заключается в том, что число больше 20! Превышает 64-разрядное целое число со знаком ( 9,223,372,036,854,775,807 ), из-за которого numba вызывает ошибку TypingError .Если таблица сокращена и включает только первые 20 целочисленных факториалов, функция работает нормально.

Есть ли способ обойти это в numba?Возможно, объявив большие целочисленные типы в скомпилированной функции jit, где используется таблица поиска?

1 Ответ

0 голосов
/ 22 февраля 2019

Может быть какой-то способ обработки больших целых чисел в Numba, но это не тот метод, который мне известен.

Но, поскольку мы знаем, что вы пытаетесь вручную написать код оценки Бета-дистрибутив в Нумбе, у меня есть несколько других предложений.

Во-первых, мы должны быть осторожны с нашим языком, чтобы не путать дистрибутив Бета и Beta функция .

Я бы порекомендовал перенести все ваши вычисления в логарифмическую шкалу.То есть вместо вычисления pdf-файла бета-распределения вы вычисляете журнал pdf бета-распределения.

Этот прием обычно используется в статистических вычислениях как журналPDF более численно стабилен, чем PDF.Например, проект Stan работает исключительно для вычисления апостериорной плотности журнала.

Из вашей истории сообщений я также знаю, что вы заинтересованы в MCMC;для выполнения MCMC также распространена практика использования журналов pdf.В случае MCMC, вместо того, чтобы иметь заднюю пропорцию, пропорциональную вероятности предыдущего времени, в логарифмической шкале вы будете иметь log -постериор, пропорциональный log -prior plus вероятность log .

Я бы порекомендовал вам использовать распределения журналов, так как это позволит вам избежать необходимости когда-либо вычислять $ \ Gamma (n) $ для больших n, который склонен к целочисленному переполнению.Вместо этого вы вычисляете $ \ log (\ Gamma (n)) $.Но разве вам не нужно вычислять $ \ Gamma (n) $ для вычисления $ \ log (\ Gamma (n)) $?Вообще-то, нет.Вы можете взглянуть на функцию scipy.special gammaln, которая позволяет вообще не вычислять $ \ Gamma (n) $.Одним из способов продвижения вперед было бы посмотреть на исходный код в scipy.special.gammaln и сделать из этого собственную реализацию numba.

В своем комментарии вы также упоминаете об использовании Аппроксимация Спуга для аппроксимации гаммыфункция.Я не использовал приближение Споуга раньше, но добился успеха с приближением Стирлинга .Если вы хотите использовать одно из этих приближений, работая в логарифмическом масштабе, вы теперь берете журнал приближения.Вы захотите использовать правила ведения журналов , чтобы переписать эти приближения.

Учитывая все вышеизложенное, я бы порекомендовал перенести вычисления из pdf в журнал pdf.,Для вычисления pdf-файла дистрибутива Beta я бы использовал это приближение функции Beta .Использование правил журналов, чтобы переписать это приближение и бета-версию PDF.Затем вы могли бы реализовать эту Numba, не беспокоясь о переполнении целых чисел.

Редактировать

Извинения, я не уверен, как форматировать математику при переполнении стека.

...