如何在 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,那么两个简单的选项是:
- 使用
makedist()
and random()
、[1]或
- 使用
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] 相关:
我用过 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,那么两个简单的选项是:
- 使用
makedist()
andrandom()
、[1]或 - 使用
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] 相关: