2016-12-02 7 views
4

Я пытаюсь создать случайное число, основанное на нормальных характеристиках распределения, которые у меня есть (среднее и стандартное отклонение). У меня нет инструментария статистики и машинного обучения.Создание случайного числа, основанного на нормальном распределении в matlab

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

f= @(y) (1/(1*2.50663))*exp(-((y).^2)/(2*1^2)) 

и решения для

r=integral(f,-Inf,z) 

, а затем экстраполировать от этого г-значения до конечного ответа X с уравнением

z=(X-mew)/sigma 

Но, насколько я знаю, нет команды matlab, которая позволяет вам решать x, где x - предел интеграла. Есть ли способ сделать это, или есть лучший способ случайным образом генерировать это число?

ответ

4

Вы можете использовать встроенную функцию randn, которая дает случайные числа, выведенные из стандартного нормального распределения с нулевым средним значением и стандартным отклонением 1. Чтобы изменить это распределение, вы можете умножить вывод randn на ваш желаемый стандарт отклонения, а затем добавить желаемое значение.

% Define the distribution that you'd like to get 
mu = 2.5; 
sigma = 2.0; 

% You can any size matrix of values 
sz = [10000 1]; 

value = (randn(sz) * sigma) + mu; 

% mean(value) 
%  2.4696 
% 
% std(value) 
%  1.9939 

Если вы просто хотите, единственное число от распределения, вы можете использовать версию не-входной randn для получения скалярного

value = (randn * sigma) + mu; 
+0

Ничего себе, идеально. Спасибо! – curt

3

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

  • логарифма равномерной случайной величины на (0,1) имеет экспоненциальное распределение
  • Квадратный корень из которого имеет распределение Рэлея
  • Умножить на косинус (или синус) равномерной случайной величины на (0,2 * pi), а результат - гауссов. Вам необходимо умножить на sqrt (2) для нормализации.

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

Пример (нормированная гауссова):

m = 1; n = 1e5; % desired output size 
x = sqrt(-2*log(rand(m,n))).*cos(2*pi*rand(m,n)); 

Проверить:

>> mean(x) 
ans = 
    -0.001194631660594 
>> std(x) 
ans = 
    0.999770464360453 
>> histogram(x,41) 

enter image description here