8

Во-первых, это правильное представление C++ для функции pdf gaussian?Использование функции гауссовой плотности вероятности в C++

float pdf_gaussian = (1/(s * sqrt(2*M_PI))) * exp(-0.5 * pow((x-m)/s, 2.0)); 

Во-вторых, имеет ли смысл, что мы делаем что-то вроде этого?

if(pdf_gaussian < uniform_random()) 
    do something 
else 
    do other thing 

EDIT: Пример того, что именно вы пытаетесь достичь:

Скажем, у меня есть данные под названием Y1. Затем приходят новые данные, называемые Xi. Я хочу видеть, следует ли мне связать Xi с Y1 или если я должен сохранить Xi в качестве новых данных данных, которые будут называться Y2. Это основано на расстоянии между новыми данными Xi и существующими данными Y1. Если Xi «далеко» от Y1, то Xi не будет ассоциировано с Y1, иначе, если оно «недалеко», оно будет связано с Y1. Теперь я хочу моделировать это «далеко» или «недалеко», используя гауссовую вероятность, основанную на среднем и stdeviation расстояний между Y и данными, которые уже связаны с Y в прошлом.

+0

Не то, что я знаю. Может быть, в математической книге? – Burkhard

+0

Ну, может быть, лучше использовать прямо уравнение, описанное здесь, http://en.wikipedia.org/wiki/Normal_distribution вместо того, чтобы использовать boost? – shn

+0

Возможный дубликат: http://stackoverflow.com/questions/2325472/generate-random-numbers-following-a-normal-distribution-in-cc –

ответ

2

есть. boost::random имеет гауссовское распространение.

См, например, этот вопрос: How to use boost normal distribution classes?

В качестве альтернативы, есть стандартный способ преобразования двух равномерно распределенных случайных чисел на два нормально распределенных чисел.

См., Например, этот вопрос: Generate random numbers following a normal distribution in C/C++

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

+0

, но не функция плотности вероятности, которая непосредственно принимает входное среднее и стандартное отклонение и значение x? – shn

+0

Ну, может быть, лучше использовать прямо уравнение, описанное здесь en.wikipedia.org/wiki/Normal_distribution, вместо того, чтобы использовать boost? – shn

+0

Вам нужно нормально распределенное случайное число или сам PDF? В последнем случае, конечно, введите формулу для распределения и сделайте с ней –

1

Использование преобразования Box-Muller. Это создает значения с нормальным/гауссовским распределением.

http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution

http://en.wikipedia.org/wiki/Box_Muller_transform

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

например.

Создайте 2 одинаковых номера, используйте их, чтобы получить два нормально распределенных номера. Затем верните одно и сохраните другое, чтобы у вас было это для вашего «следующего» запроса случайного числа.

9

Технически

float pdf_gaussian = (1/(s * sqrt(2*M_PI))) * exp(-0.5 * pow((x-m)/s, 2.0)); 

не неправильно, но может быть улучшена.

Во-первых, 1/sqrt(2 Pi) может быть предварительно вычисленное и использование pow с целыми числами, не является хорошей идеей: он может использовать exp(2 * log x) или рутина специализированы для плавающей запятой экспонент а не просто x * x.

Пример лучше код:

float normal_pdf(float x, float m, float s) 
{ 
    static const float inv_sqrt_2pi = 0.3989422804014327; 
    float a = (x - m)/s; 

    return inv_sqrt_2pi/s * std::exp(-0.5f * a * a); 
} 

Вы можете сделать это шаблон, вместо того, чтобы использовать float:

template <typename T> 
T normal_pdf(T x, T m, T s) 
{ 
    static const T inv_sqrt_2pi = 0.3989422804014327; 
    T a = (x - m)/s; 

    return inv_sqrt_2pi/s * std::exp(-T(0.5) * a * a); 
} 

это позволяет использовать normal_pdf на double аргументы также (это не так гораздо более общий, хотя). Есть предостережения с последним кодом, а именно, что вы должны остерегаться не использовать его с целыми числами (есть обходные пути, но это делает процедуру более подробной).

+0

, но я не понимаю, почему функция gaussian pdf возвращает некоторые небольшие значения между 0 и 1 по сравнению с равномерным распределением? Вы видите пример, который я дал о себе: 'если (pdf_gaussian shn

Смежные вопросы