【问题标题】:Select randomly from array with given probabilites without replacement从具有给定概率的数组中随机选择而无需替换
【发布时间】:2018-08-05 20:43:15
【问题描述】:

假设我有一个项目数组[1,2, ...n] 和一个概率数组[p1,p2,....,pn],其中n 是一个非常大的数字,可能达到数千。所有概率之和等于 1。

  • 我需要每次随机选择3个唯一的项目,概率高的项目被选中的机会更高。

  • 我需要进行超过 20k 次的选择。

我通过创建一个新数组来实现一种工作方法,该数组包含基于概率重复的项目。例如,如果 item1、item2 和 item3 的概率分别为[2/n,4/n,1/n],那么新数组将包含[1,1,2,2,2,2,3]

它工作正常,但效率不高。另外,使用这种方法有可能多次选择同一个项目,然后我必须重新选择另一个耗费时间的项目。

MATLAB 中是否有任何有效的方法或内置函数可用于此目的?

【问题讨论】:

  • 我认为这回答了你的问题:stackoverflow.com/a/13914141/1011724
  • 同样对于 pick without replacement 问题,如果 n 很大并且您只选择 3 个值,您可能只想检查重复项并在找到时重新选择.
  • 您为项目指定概率,但您还希望不替换进行抽样。有了这两个要求,似乎很难避免重新挑选。例如,randsample 可以处理任一要求,但不能同时处理这两个要求。另请注意,在您当前的方法中,如果采样值不是唯一的,您应该重新开始并重新选择所有项,否则无法保证概率
  • 这不是链接问答的欺骗,因为这里没有替换要求

标签: matlab random probability


【解决方案1】:

你的初始数组

 x = [1, 2, 3];   % 1:n, where n = 3
 p = [2, 4, 1]/7; % probabilities of choosing each element

您可以使用以下方法选择具有给定概率的元素:

 r = rand; % get random number in range (0,1)
 xi = x(find(cumsum(p) >= r, 1)); % Get x where cumulative probability >= random number

你想选择不替换,所以让我们在每个循环中删除元素

k = 2;           % number of choices
r = rand(k,1);   % random numbers
xi = zeros(k,1); % output choices
for ii = 1:k     % choices loop
    % Choose x with probability of each element contained in p
    idx = find(cumsum(p) >= r(ii), 1);
    xi(ii) = x(idx);
    % Remove item from lists
    x(idx) = []; p(idx) = [];
    % Rescale probabilities
    p = p/sum(p);
end

使用此方法,重复的x 条目将被视为独立于它们自己指定的p 值。

注意:如果您想在N 次进行此选择,请使用一些临时的xp 变量,这样下次您进行选择时就不会删除一些元素!或者更好的是,将选择循环矢量化并将xp 转换为N×n,每次从每一行中删除一个元素。

【讨论】:

    【解决方案2】:

    函数datasample 可以满足您的要求,如果您将它与可选参数Weights 和权重数组一起使用。

    注意: datasample 使用旧函数 histc 生成样本,而建议使用较新的函数 histcounts。尽管如果您想要更高的效率,这只是一个问题。引用文档:

    不推荐使用 histc。请改用 HISTCOUNTS。

    【讨论】:

      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2022-01-08
      • 2023-04-03
      • 2012-12-04
      相关资源
      最近更新 更多