我使用过Matlab,但我也欢迎使用Python作为解决方案。
我有一个随机变量 Var
的预测 CDF(即 CDF^),并且希望使用该预测 CDF (CDF^) 生成 N 个场景。这是我所做的。我想知道这个方法是否有意义,以及如何在步骤3中自动生成N个场景。
1) 我使用 CDF^ 上的 MLE 拟合假设的累积分布函数(假设为威 bool ),并获得了拟合函数的相应参数。
2) 使用这些参数,我绘制了假设分布的 pdf。
3)在这一步中,我不知道该做什么以及如何做!基本上我想,我应该离散化 var
并通过计算每个矩形的面积来找到每个线段对应的概率。
4) 由于原始数据 (var) 已经是 CDF 形式,因此如何以 PMF 形式绘制原始数据 (var)?!
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()
和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);
绘制原始数据:
如果假设数据来自连续分布(例如威 bool 分布),则应使用 probability density function (PDF)直观地显示相对机会而不是离散的probability mass function (PMF) 。 PMF 仅适用于离散变量。请注意cumulative distribution functions (CDFs)适用于连续和离散随机变量。
这可以通过histogram()
中的'Normalization','pdf'
名称-值对来完成。特性。为了获得更好的结果,通常建议调整直方图箱的数量(在属性中),但只有 13 个数据点,这值(value)有限。
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()
可容纳 kernel density并且仍然允许使用 Probability distribution objects 的所有功能,包括random()
和 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]相关:https://stackoverflow.com/a/56759220/8239061
关于python - 如何在 Matlab 或 Python 中使用预测的 cdf 生成一些场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971640/