【问题标题】:How to choose one element based on its probability? [duplicate]如何根据概率选择一个元素? [复制]
【发布时间】:2014-12-15 17:20:29
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: matlab probability stochastic-process


    【解决方案1】:

    如果您使用统计工具箱(否则请参阅Stewie's answer)导出经验 cdf,然后使用inverse sampling

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

    其中bin 直接映射到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 
    

    【讨论】:

      【解决方案2】:

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

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

      它的作用是从向量1:numel(v) 中取出一个随机数,其概率分布如v 中给出。如果你想要几个值,你可以把第二个参数改成你想要的随机数的个数。

      【讨论】:

        猜你喜欢
        • 2016-01-30
        • 2015-08-22
        • 2021-12-29
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 2013-08-27
        相关资源
        最近更新 更多