Как сгенерировать некоторые сценарии, используя предсказанный cdf в Matlab или Python?

Я использовал Matlab, но я также приветствую Python в качестве решения.

У меня есть предсказанная CDF (т.е. CDF ^) случайной переменной Var, и я хотел бы сгенерировать N сценариев, используя эту предсказанную CDF (CDF ^). Вот что я сделал. Я хотел бы знать, имеет ли этот метод смысл, а также как я могу автоматически сгенерировать N сценариев на шаге 3.

1) Я подобрал предполагаемую кумулятивную функцию распределения (скажем, Вейбулла), используя MLE на CDF ^, и получил соответствующие параметры подобранной функции.

2) Используя эти параметры, я построил PDF предполагаемого распределения.

3) На этом этапе я не уверен, что и как делать! В основном, я думаю, я должен дискретизировать var и найти соответствующую вероятность каждого сегмента, вычислив площадь каждого прямоугольника.

4) Как я могу построить свои исходные данные (var) в форме PMF, поскольку они уже находятся в форме CDF ?!

var= [ 0.001    0.01    97  145 150 189 202 183 248 305 492 607 1013];
cdf_prob = [0.01, 0.05, 0.15, 0.25, 0.35, 0.45, 0.50, 0.55, 0.65, 0.75, 0.85, 0.95, 0.99];
                             % cumulative prob.
a= mle(var, 'distribution', 'wbl');              
plot(var, cdf_prob, 'o-')                         % my data
hold on
xgrid = linspace (0, 1.1*max(var));
plot (xgrid, wblcdf(xgrid,a(1),a(2)));            % fitted cdf

figure(2)                                         % fitted PDF
pd= makedist('wbl', 'a', a(1),'b', a(2));
y=pdf(pd, xgrid);
plot(xgrid,y)

Шаг 3:
Шаг 3


person JES0    schedule 29.01.2020    source источник
comment
Вы смотрели random()? Я думаю, что есть множество связанных сообщений, посвященных этому (1, 2, 3).   -  person SecretAgentMan    schedule 29.01.2020
comment
Я немного озадачен. Вы пытаетесь сгенерировать N образцов из определенного распределения? Мы можем это сделать. Кроме того, почему теги python и matlab?   -  person SecretAgentMan    schedule 29.01.2020
comment
Я не мог найти ответ на свой вопрос непосредственно в этих постах. Но да, у меня есть предсказанный CDF, который, как мы знаем, должен быть в форме Вейбулла. Я получил его параметры с помощью MLE. Теперь я хочу сгенерировать N выборок из полученного распределения Вейбулла. Более того, как я могу построить свои данные (var) в формате PMF, поскольку они находятся в форме CDF. @SecretAgentMan   -  person JES0    schedule 30.01.2020
comment
Решение на Python также удовлетворило бы мои потребности.   -  person JES0    schedule 30.01.2020


Ответы (1)


Создание образцов:
Вы можете создавать образцы из дистрибутива множеством способов. Если вы уже знаете, что собираетесь использовать конкретный дистрибутив, например дистрибутив Weibull, тогда два простые варианты:

  1. Используйте makedist() и _ 2_, [1] или
  2. Используйте wblrnd().

Оба требуют использования панели инструментов Статистика. Возможны также подходы без инструментов. Рекомендуется избегать именования переменной var, поскольку она маскирует функцию var().

% MATLAB R2019a
a = [209.2863 0.5054];        % a = mle(var, 'distribution', 'wbl');  % from OP code
NumSamples = 500;
pd = makedist('Weibull',a(1),a(2))    

% Method 1
X = random(pd,NumSamples,1);

% Method 2
X2 = wblrnd(a(1),a(2),NumSamples,1);

Построение исходных данных:
Если данные предполагаются из непрерывного распределения, такого как распределение Вейбулла, то следует использовать функция плотности вероятности (PDF) для визуального отображения относительного шанса, а не дискретного функция массы вероятности (PMF). PMF применяются только к дискретным переменным. Обратите внимание, что кумулятивные функции распределения (CDF) применяются как для непрерывных, так и для дискретных случайных величин.

Это можно сделать с помощью пары 'Normalization','pdf' имя-значение в _ 8_ свойства. Для достижения лучших результатов часто рекомендуется регулировать количество интервалов гистограммы (в свойствах), но только с 13 точками данных это имеет ограниченное значение.

h = histogram(var,'Normalization','pdf')
h.NumBins = 13;

Вы также можете наложить подобранное распределение на эмпирические данные.

figure, hold on
h = histogram(var,'Normalization','pdf','DisplayName','Data');
xLimits = xlim;
Xrng = 0:.01:xLimits(2);
plot(Xrng,pdf(pd,Xrng),'r--','DisplayName','Fit')
xlabel('Var')
ylabel('Probability Density Function (PDF)')
legend('show')

% Adjust these manually
ylim([0 0.02])
h.NumBins = 13;

Альтернативы: [2]

Вы можете использовать fitdist(), который может соответствовать плотность ядра и по-прежнему позволяет использовать все функции для Объекты распределения вероятностей, включая _ 12_ и _ 13_.

Обратите внимание, что я усек дистрибутив, поскольку Weibull поддерживает [0, inf].

pd2 = fitdist(X,'Kernel')
pd2t = truncate(pd2,0,inf)

Тогда построение графика все еще относительно просто и похоже на предыдущий пример.

figure, hold on
h = histogram(var,'Normalization','pdf','DisplayName','Data');
xLimits = xlim;
Xrng = 0:.01:xLimits(2);
plot(Xrng,pdf(pd2t,Xrng),'r--','DisplayName','Fit')
xlabel('Var')
ylabel('Probability Density Function (PDF)')
legend('show')
h.NumBins = 13;

Оставшаяся альтернатива - использовать ksdensity() для получения сюжета.


[1] Создание образцов из распределения Вейбулла в MATLAB
[2] Связано: https://stackoverflow.com/a/56759220/8239061

person SecretAgentMan    schedule 30.01.2020