2

假设我有一个包含 N 个元素的向量,每个元素都是它的概率。例如,v = [0.01 0.01 0.09 0.82 0.07]

所以我想要一个函数f(v),它在 82% 的时间返回 4,在 9% 的时间返回 3,等等。

输入向量 v 总是被归一化,因此sum(v) = 1,这可以是一个简化。

如何在 MATLAB 中实现这个概率函数?或者也许有一个内置功能?

4

2 回答 2

4

如果你有统计工具箱,你可以使用randsample

f = randsample(1:numel(v), 1, true, v) 

这样做是从向量 中获取一个随机数1:numel(v),其概率分布如 中所示v。如果您想要多个值,您可以将第二个参数更改为您想要的随机数的数量。

于 2014-10-20T16:46:54.327 回答
4

如果您没有统计工具箱(否则请参阅Stewie 的答案)导出经验 cdf,然后使用反向采样

% Numbers of draws
N = 1e3; 
% Sample a uniform in (0, 1)
x = rand(N,1);

% Empirical cdf
ecdf = cumsum([0, v]);

% Inverse sampling/binning 
[counts, bin] = histc(x,ecdf);

wherebin直接映射到v. y所以,如果你有一组带有概率的通用值v,你应该采取:

out = y(bin);

请注意,随着抽签次数的N增加,我们得到了更好的概率近似值:

counts(end) = []; % Discard last bucket x==1
counts./sum(counts)

该功能可以是:

function [x, counts] = mysample(prob, val, N)
if nargin < 2 || isempty(val), val = 1:numel(prob); end
if nargin < 3 || isempty(N),   N   = 1;             end 

[counts, bin] = histc(rand(N,1), cumsum([0, prob(:)']));
x = val(bin);

end 
于 2014-10-20T16:57:15.993 回答