Выборка из дискретного распределения вероятностей в C ++ - PullRequest
4 голосов
/ 31 марта 2012

Я новичок в C ++ и чрезвычайно удивлен отсутствием доступных, распространенных инструментов для манипулирования вероятностями (то есть отсутствием вещей в Boost и стандартной библиотеке). Я много занимался научным программированием на других языках, но стандартные и / или вездесущие сторонние дополнения всегда включают в себя полный набор вероятностных инструментов. Друг объявил, что Boost является эквивалентным вездесущим дополнением для C ++, но когда я читаю документацию Boost, даже у него, похоже, не хватает того, что я считаю чрезвычайно элементарными встроенными модулями.

Я не могу найти встроенную функцию, которая принимает некоторый массив дискретных вероятностей и производит индекс, выбранный в соответствии с этими вероятностями. Конечно, я могу написать свою собственную функцию для этого, но я просто хотел проверить, не хватает ли мне стандартного способа сделать это.

Мне кажется, что писать свои собственные функции на таком низком уровне плохо, но я пишу новый модуль моделирования для более крупного проекта, все на C ++. Моя обычная тактика перехода состоит в том, чтобы написать это на Python и связать Python с C ++, но поскольку нескольким людям придется управлять этим кодом, как только я закончу его, и никто из них не знает Python, я думаю, что это будет быть более разумным, чтобы доставить их всем на C ++.

В более общем смысле, что люди делают в C ++ для таких вещей, как выборка из стандартных дистрибутивов, в частности, таких простых, как многовариантное нормальное распределение?

Ответы [ 5 ]

4 голосов
/ 31 марта 2012

Возможно, я неправильно понимаю ваше намерение, но мне кажется, что вы просто хотите std::discrete_distribution.

3 голосов
/ 31 марта 2012

(Удалено из комментария.)

Вы смотрели на Boost.Math.StatisticalDistributions ?В частности, его дискретных вероятностных распределений ?

Boost - это не библиотека, а коллекция библиотек, поэтому иногда бывает трудно найти именно то, чтоищу - но это не значит, что его там нет.; -]

2 голосов
/ 31 марта 2012

Как уже упоминалось, вы захотите посмотреть на boost/math/distributions и друзей, чтобы удовлетворить ваши потребности.

Вот очень хороший, подробный учебник о том, как заставить их работать на вас в Boost. Вы также можете сбросить свой вес за stan , что выглядит довольно многообещающе в этом пространство.

0 голосов
/ 31 марта 2012

Математические библиотеки Boost довольно хороши для работы с различными дистрибутивами, но если вас интересует только сэмплирование (как в проблеме, о которой вы упоминали в своем посте), то, возможно, стоит взглянуть на улучшенные Random библиотеки. более уместно для вашей задачи. Эта ссылка показывает, как, например, имитировать вращение взвешенного штампа.

0 голосов
/ 31 марта 2012

Вы должны делать меньше C ++ и больше задавать вопросы - мы стараемся быть полезными и уважительными в SO. Такие вопросы, как ваш, часто помечаются как подстрекательские.

Boost::math, кажется, обеспечивает именно то, что вы ищете: https://www.quantnet.com/cplusplus-statistical-distributions-boost/ - я не уверен на 100% в том, насколько хорошо он обрабатывает многовариантные распределения (и при этом я не эксперт по статистике) .

Получите это здесь: http://www.boost.org/doc/libs/1_49_0/libs/math/doc/html/index.html

...