Генерация треугольного распределения в Matlab - PullRequest
1 голос
/ 11 февраля 2012

Я попытался сгенерировать треугольное распределение вероятностей в Matlab, но безуспешно.Я использовал формулу в http://en.wikipedia.org/wiki/Triangular_distribution.

n = 10000000;

a = 0.2;
b = 0.7;
c = 0.5;

u = sqrt(rand(n, 1));

x = zeros(n, 1);
for i = 1:n
    U = u(i);
    if U < (c-a)/(b-a)
        X = a + sqrt(U*(b-a)*(c-a));
    else
        X = b - sqrt((1-U)*(b-a)*(b-c));        
    end
    x(i) = X;
end

hist(x, 100);

Гистограмма выглядит следующим образом:

enter image description here

Для меня не похоже на треугольник.В чем проблема?Я злоупотребляю rand(n)?

Ответы [ 3 ]

5 голосов
/ 11 февраля 2012

вы можете сложить два равномерных распределения, графики распределения свернуты, и вы получите треугольное распределение.

простой для понимания пример: бросание двух кубиков, каждое действие имеет равномерное распределение, в результате чего получается числос 1-6, комбинированное действие имеет треугольное распределение, в результате чего получается число 2-12

edit: минимальный рабочий пример:

a=randint(10000,1,10);
b=randint(10000,1,10);

c=a+b;

hist(c,max(c)-min(c)+1)

edit2: снова посмотрел в вашем скрипте.Это работает, но вы допустили одну ошибку:

u = sqrt(rand(n, 1));

должно быть

u = rand(n, 1);

edit3: оптимизированный код

n = 10000000;

a = 0.2;
b = 0.7;
c = 0.5;

u = rand(n, 1);
x = zeros(n, 1);

idx = find(u < (c-a)/(b-a));
x(idx) = a + sqrt(u(idx)*(b-a)*(c-a));
idx =setdiff(1:n,idx);
x(idx) = b - sqrt((1-u(idx))*(b-a)*(b-c));
hist(x, 100);

2 голосов
/ 21 октября 2018

В этом примере используются команды makedist и pdf.

a = 2; m = 7; b = 10;
N = 50000;
pd = makedist('Triangular',a,m,b);     % Create probability distribution object

X = (0:.1:12);
T = random(pd,N,1);                    % Generate samples from distribution

figure, hold on, box on
histogram(T,'Normalization','pdf')
title([num2str(N) ' Samples'])
plot(X,pdf(pd,X),'r--','LineWidth',1.8)
legend('Empirical Density','Theoretical Density','Location','northwest')

Треугольное распределение с нижней границей a = 7, режим m = 10 и верхней границей b =10.
Triangular Distribution


Введена MATLAB makedist в R2013a.Требуется набор инструментов статистики.

Ссылка:
Треугольное распределение

1 голос
/ 11 февраля 2012

Изменить

u = sqrt(rand(n, 1));

на

u = rand(n, 1);

Приятно, что в этой формуле можно распределить выборку из общего распределения треугольника с одной случайной выборкой.

...