Как создать сценарий ios с использованием прогнозируемого cdf в Matlab или Python? - PullRequest
2 голосов
/ 29 января 2020

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

У меня есть прогнозируемый CDF (т. Е. CDF ^) случайной величины Var, и я хотел бы создать N сценарий ios с использованием этого прогнозируемого CDF (CDF ^). Вот что я сделал. Я хотел бы знать, имеет ли этот метод смысл, а также как я могу автоматически сгенерировать N сценариев ios на шаге 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:
Step 3

1 Ответ

2 голосов
/ 30 января 2020

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

  1. Использовать makedist() и random(), [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' в свойствах histogram(). Для достижения лучших результатов часто рекомендуется корректировать количество бинов гистограммы (в свойствах), но только с 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(), который может соответствовать плотность ядра и все еще разрешает использовать все функции для объектов распределения вероятностей , включая random() и pdf().

Обратите внимание, что я усек дистрибутив, поскольку 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] Похожие: { ссылка }

...