从 Matlab 中预先指定的概率质量函数中抽取随机数
Draw random numbers from pre-specified probability mass function in Matlab
我在Matlab中有一个支持(supp_epsilon
)和一个概率质量函数(pr_mass_epsilon
),构造如下
supp_epsilon=[0.005 0.01 0.015 0.02];
suppsize_epsilon=size(supp_epsilon,2);
pr_mass_epsilon=zeros(suppsize_epsilon,1);
alpha=1;
beta=4;
for j=1:suppsize_epsilon
pr_mass_epsilon(j)=betacdf(supp_epsilon(j),alpha,beta)/sum(betacdf(supp_epsilon,alpha,beta));
end
请注意 pr_mass_epsilon
的组成部分总和为 1
。现在,我想从 pr_mass_epsilon
中抽取 n
个随机数。我怎样才能做到这一点?我想要一个适用于任何 suppsize_epsilon
的代码。
使用统计工具箱
randsample
函数可以直接做到这一点:
result = randsample(supp_epsilon, n, true, pr_mass_epsilon);
不使用工具箱
手动方法:
- 在区间 (0,1) 中生成
n
个均匀随机变量的样本。
- 将每个样本与分布函数(质量函数的累积和)进行比较。
- 查看每个均匀样本位于分布函数的哪个区间。
- 可能值数组的索引
result = supp_epsilon(sum(rand(1,n)>cumsum(pr_mass_epsilon(:)), 1)+1);
对于您的示例,使用 n=1e6
两种方法中的任何一种都会给出类似于此的直方图:
histogram(result, 'normalization', 'probability')
我在Matlab中有一个支持(supp_epsilon
)和一个概率质量函数(pr_mass_epsilon
),构造如下
supp_epsilon=[0.005 0.01 0.015 0.02];
suppsize_epsilon=size(supp_epsilon,2);
pr_mass_epsilon=zeros(suppsize_epsilon,1);
alpha=1;
beta=4;
for j=1:suppsize_epsilon
pr_mass_epsilon(j)=betacdf(supp_epsilon(j),alpha,beta)/sum(betacdf(supp_epsilon,alpha,beta));
end
请注意 pr_mass_epsilon
的组成部分总和为 1
。现在,我想从 pr_mass_epsilon
中抽取 n
个随机数。我怎样才能做到这一点?我想要一个适用于任何 suppsize_epsilon
的代码。
使用统计工具箱
randsample
函数可以直接做到这一点:
result = randsample(supp_epsilon, n, true, pr_mass_epsilon);
不使用工具箱
手动方法:
- 在区间 (0,1) 中生成
n
个均匀随机变量的样本。 - 将每个样本与分布函数(质量函数的累积和)进行比较。
- 查看每个均匀样本位于分布函数的哪个区间。
- 可能值数组的索引
result = supp_epsilon(sum(rand(1,n)>cumsum(pr_mass_epsilon(:)), 1)+1);
对于您的示例,使用 n=1e6
两种方法中的任何一种都会给出类似于此的直方图:
histogram(result, 'normalization', 'probability')