Преобразование равномерного распределения в нормальное распределение - PullRequest
95 голосов
/ 16 сентября 2008

Как я могу преобразовать равномерное распределение (как производит большинство генераторов случайных чисел, например, между 0,0 и 1,0) в нормальное распределение? Что если я хочу среднее и стандартное отклонение по своему выбору?

Ответы [ 16 ]

0 голосов
/ 09 ноября 2018

У меня есть следующий код, который может помочь:

set.seed(123)
n <- 1000
u <- runif(n) #creates U
x <- -log(u)
y <- runif(n, max=u*sqrt((2*exp(1))/pi)) #create Y
z <- ifelse (y < dnorm(x)/2, -x, NA)
z <- ifelse ((y > dnorm(x)/2) & (y < dnorm(x)), x, z)
z <- z[!is.na(z)]
0 голосов
/ 28 ноября 2017

Это реализация Matlab, использующая полярную форму преобразования Box-Muller :

Функция randn_box_muller.m:

function [values] = randn_box_muller(n, mean, std_dev)
    if nargin == 1
       mean = 0;
       std_dev = 1;
    end

    r = gaussRandomN(n);
    values = r.*std_dev - mean;
end

function [values] = gaussRandomN(n)
    [u, v, r] = gaussRandomNValid(n);

    c = sqrt(-2*log(r)./r);
    values = u.*c;
end

function [u, v, r] = gaussRandomNValid(n)
    r = zeros(n, 1);
    u = zeros(n, 1);
    v = zeros(n, 1);

    filter = r==0 | r>=1;

    % if outside interval [0,1] start over
    while n ~= 0
        u(filter) = 2*rand(n, 1)-1;
        v(filter) = 2*rand(n, 1)-1;
        r(filter) = u(filter).*u(filter) + v(filter).*v(filter);

        filter = r==0 | r>=1;
        n = size(r(filter),1);
    end
end

И вызывая histfit(randn_box_muller(10000000),100); это результат: Box-Muller Matlab Histfit

Очевидно, что он действительно неэффективен по сравнению со встроенным в Matlab randn .

0 голосов
/ 03 декабря 2015

Q Как я могу преобразовать равномерное распределение (как производит большинство генераторов случайных чисел, например, между 0,0 и 1,0) в нормальное распределение?

  1. Для реализации программного обеспечения я знаю пару имен случайных генераторов, которые дают вам псевдооднородную случайную последовательность в [0,1] (Mersenne Twister, Linear Congruate Generator). Давайте назовем это U (x)

  2. Существует математическая область, которая называется теорией вероятностей. Первое: если вы хотите моделировать р.в. с интегральным распределением F, то вы можете попробовать просто оценить F ^ -1 (U (x)). В пр.теории было доказано, что такое р.в. будет иметь интегральное распределение F.

  3. Шаг 2 может быть применим для генерации r.v. ~ F без использования каких-либо методов подсчета, когда F ^ -1 может быть получен аналитически без проблем. (например, exp.distribution)

  4. Для моделирования нормального распределения вы можете рассчитать y1 * cos (y2), где y1 ~ равномерно в [0,2pi]. и у2 - распределение релизов.

В: Что если я хочу получить среднее и стандартное отклонение по своему выбору?

Вы можете рассчитать сигма * N (0,1) + м.

Можно показать, что такое смещение и масштабирование приводят к N (м, сигма)

0 голосов
/ 01 октября 2012

Приближение:

function rnd_snd() {
    return (Math.random()*2-1)+(Math.random()*2-1)+(Math.random()*2-1);
}

См. http://www.protonfish.com/random.shtml

0 голосов
/ 19 января 2012

Я думаю, вы должны попробовать это в EXCEL: =norminv(rand();0;1). Это произведет случайные числа, которые должны обычно распределяться с нулевым средним и объединять дисперсию. «0» может быть снабжено любым значением, так что числа будут иметь желаемое среднее значение, и, изменив «1», вы получите дисперсию, равную квадрату вашего ввода.

Например: =norminv(rand();50;3) уступит нормально распределенным числам со MEAN = 50 VARIANCE = 9.

0 голосов
/ 17 сентября 2008
function distRandom(){
  do{
    x=random(DISTRIBUTION_DOMAIN);
  }while(random(DISTRIBUTION_RANGE)>=distributionFunction(x));
  return x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...