Генерация значений из нормального распределения методом Бокса-Мюллера - PullRequest
1 голос
/ 31 марта 2012

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

Вот мой исходный код

import random

def generate_normal(mu, sigma):
    u = random.random()
    v = random.random()

    z1 = sqrt(-2 * log(u)) * sin(2 * pi * v)
    z2 = sqrt(-2 * log(u)) * cos(2 * pi * v)

    x1 = mu + z1 * sigma
    x2 = mu + z2 * sigma

    return x2

Что мне не хватает? Я получаю отрицательные значения как x1, так и x2.Например:

mu: 400
sigma: 150
u: 7.27333176449e-05
v: 0.642384573173
z1: -3.40497345242
x1: -110.746017863

и:

x2: -9.79324023117

Ответы [ 2 ]

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

Единица нормальное распределение центрируется на нуле и двусторонне с небольшими хвостами, идущими в плюс и минус бесконечность. 99,7% от ваших значений будет лежать в пределах трех стандартных отклонений, остальные 0,3% - нет.

enter image description here

В этом примере со средним значением 400и стандартное отклонение 150, 99,7% ваших значений будут находиться в пределах трех стандартных отклонений среднего значения - интервала [-50 850], который включает отрицательные числа.Так что ожидайте отрицательных чисел сразу.

Что касается остальных 0,3% значений, помните, что это 3/1000 ваших чисел - совсем не редкость.

Если вам нужен «звонок»-curvey "дистрибутив с ограниченной поддержкой, попробуйте бета-дистрибутив .

Наконец, если это не академическое упражнение, нет необходимости бросать свой собственный эквивалент numpy.random.normal().

0 голосов
/ 02 июня 2014

Преобразование Бокса-Мюллера имеет проблемы со стабильностью, когда случайно сгенерированное значение очень близко к нулю. Я рекомендую заменить random.random () на gaussinan и повлиять на среднее значение и стандартное отклонение.

...