如何在 Matlab 或 Python 中使用预测的 cdf 生成一些场景?

How to do generate some scenarios using a predicted cdf in Matlab or Python?

我用过 Matlab,但我也欢迎 python 提供解决方案。

我有一个随机变量的预测 CDF(即 CDF^)Var,我想使用这个预测的 CDF(CDF^)生成 N 个场景。这是我所做的。我想知道这个方法是否有意义,以及如何在步骤3中自动生成N个场景。

1) 我使用 CDF^ 上的 MLE 拟合假设的累积分布函数(假设是 Weibull)并获得拟合函数的相应参数。

2) 使用这些参数,我绘制了假定分布的 pdf。

3) 在这一步,我不知道该做什么,怎么做!基本上我猜想,我应该离散化var,通过计算每个矩形的面积来找到每个线段对应的概率。

4) 由于原始数据 (var) 已经是 CDF 形式,我该如何绘制它的 PMF 形式?!

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 步:

生成样本:
您可以通过多种方式从分布中生成样本。如果您已经知道要使用特定的发行版,例如 Weibull distribution,那么两个简单的选项是:

  1. 使用makedist() and 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);

绘制原始数据:
如果假设数据来自连续分布,例如 Weibull 分布,则应使用 probability density function (PDF) to visually show relative chance rather than a discrete probability mass function (PMF). PMFs only apply to discrete variables. Note that cumulative distribution functions (CDFs) 申请连续和离散随机变量。

这可以通过 histogram() 属性中的 'Normalization','pdf' 名称-值对来完成。为了获得更好的结果,通常建议调整直方图 bin 的数量(在属性中),但只有 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() which can fit a kernel density and still permits using all the functions for Probability distribution objects, including random() and pdf().

注意我已经 truncated 分布,因为 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] Generating samples from Weibull distribution in MATLAB
[2] 相关: