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

标签 python matlab probability sample cdf

我使用过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 步:
Step 3

最佳答案

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

  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);

绘制原始数据:
如果假设数据来自连续分布(例如威 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/

相关文章:

user-interface - Matlab TabPanel的使用

sql - 选择 "similar"组 - 从哪里开始概率?

python - 使用python的视频元数据

python - 将括号中的单词作为组正则表达式获取

string - 在字符串列表中的字符之间插入符号 ">"

Matlab UI 控制单元

javascript - 如何在给定一定数量的骰子掷骰的情况下控制事件发生的概率

c++ - 从非常大的值集中快速加权随机选择

python - 使用掩码反转二进制 NumPy 数组

Python 3 : How to compare two tuples and find similar values?