假设我有一个包含 N 个元素的向量,每个元素都是它的概率。例如,v = [0.01 0.01 0.09 0.82 0.07]
所以我想要一个函数f(v)
,它在 82% 的时间返回 4,在 9% 的时间返回 3,等等。
输入向量 v 总是被归一化,因此sum(v) = 1
,这可以是一个简化。
如何在 MATLAB 中实现这个概率函数?或者也许有一个内置功能?
假设我有一个包含 N 个元素的向量,每个元素都是它的概率。例如,v = [0.01 0.01 0.09 0.82 0.07]
所以我想要一个函数f(v)
,它在 82% 的时间返回 4,在 9% 的时间返回 3,等等。
输入向量 v 总是被归一化,因此sum(v) = 1
,这可以是一个简化。
如何在 MATLAB 中实现这个概率函数?或者也许有一个内置功能?
如果你有统计工具箱,你可以使用randsample
:
f = randsample(1:numel(v), 1, true, v)
这样做是从向量 中获取一个随机数1:numel(v)
,其概率分布如 中所示v
。如果您想要多个值,您可以将第二个参数更改为您想要的随机数的数量。
如果您没有统计工具箱(否则请参阅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