Быстрое внедрение обратной неполной бета-функции в C ++ - PullRequest
4 голосов
/ 22 января 2012

Я ищу реализацию Inverse Incomplete Beta Function, возможно, уже написанную на C ++ или простую для реализации самостоятельно.Однако мне нужно, чтобы это было БЫСТРО!Например, я собираюсь выполнить это во внутреннем цикле оптимизатора, так что, надеюсь, это займет менее пары сотен тактов.

Здесь уже есть пара потоков, но в этом случае я готов отбросить много точности для скорости.Кроме того, домен несколько ограничен, так как я использую только целочисленные значения для a и b.

Дополнительные сведения об этой проблеме: я даю целое число испытаний n и целое число k <= nиз этих испытаний, которые были успешными.Я предполагаю, что фоновое распределение для основной вероятности успешного испытания является равномерным в [0,1], поэтому, учитывая, что я видел некоторое количество испытаний и успехов, мое последующее распределение должно быть бета-распределением.В байесовской модели я, по сути, пытаюсь найти p-й процентиль вероятных основных вероятностей. </p>

Опять же, мне не нужно, чтобы это было чрезвычайно точно, просто быстро.Я могу справиться с погрешностью до +/- 1%.Тем не менее, это не может быть очень неточным для небольших чисел: мои входные данные варьируются от нуля до десятков тысяч.

Заранее спасибо!Если понадобится какое-либо разъяснение, дайте мне знать.

1 Ответ

4 голосов
/ 22 января 2012
  1. Один из подходов - составить таблицу. Если вам нужно дифференцировать, вам нужно интерполировать его. Это, вероятно, только альтернатива для вас, если вы сохраните все параметры, кроме одного, фиксированными, но я думаю, что вы делаете? (ОП говорит нет)

    Возможно, вы захотите сделать объединение таблиц нелинейным, чтобы получить хорошую точность при малом x, как вы и просили. Попробуйте размер корзины, пропорциональный x, x ^ 2 и т. Д.

  2. Используйте простой метод поиска, такой как http://en.wikipedia.org/wiki/Secant_method, чтобы найти свое значение как функцию увеличения мощности (не обратной) неполной бета-функции. http://en.wikipedia.org/wiki/Beta_function#Incomplete_beta_function. Это работает, только если оно однообразно.

  3. Сначала убедитесь, что вам действительно нужно создать свой собственный метод. Возможно, попробуйте это в первую очередь? http://www.boost.org/doc/libs/1_35_0/libs/math/doc/sf_and_dist/html/math_toolkit/special/sf_beta/ibeta_inv_function.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...