【问题标题】:Picking objects from a vector with defined probabilities on matlab/octave在 matlab/octave 上从具有定义概率的向量中挑选对象
【发布时间】:2014-03-24 11:46:31
【问题描述】:

Matlab/Octave 上是否有任何函数可以根据给定的概率从列表中随机选择一个值?

例如:我们有向量 [1 3 7]。我正在寻找的函数应该选择概率为 0.25 的 1、0.35 的 3 和 0.4 的 7 的数字之一。

我正在尝试自己实现它,但我想知道是否有一些内置功能,以便下次我需要这样的东西时使用。

【问题讨论】:

    标签: matlab list random octave


    【解决方案1】:

    您正在寻找一个名为randsample 的函数统计工具箱。它从n 中采样k 值并进行替换(不支持不进行替换)。您想选择一个值,可以这样做:

    nSamplesToChoose=1;
    weightVector=[0.2 0.5 0.3];%weights some to one so as to represent probability distribution
    yourArray=[5 6 7]; %length of the array should be same as the length of weightVector.
    chosenSample=randsample(yourArray,nSamplesToChoose,true,weightVector)
    

    附:我鼓励你自己实现这个。你可以参考this问题。

    【讨论】:

    • 我确实实现了它function pick = randompick(vector, probs) r = rand() c = 0 for i in 1:size(vector)(2) if c < r and r < c + probs(i) pick = vector(i) c = c + probs(i) end end endfunction 我只是想知道是否有任何东西,以防我再次需要它。 randsample 听起来很完美,非常感谢 :-)
    • 好像支持替换。 http://octave.sourceforge.net/statistics/function/randsample.html从包含 n 个元素的向量 v 返回 k 个随机元素,在没有或有替换的情况下采样。
    • 请注意,weightVector 不必求和为 1,因此如果您指的是概率,则必须确保它求和为 1。例如 Parag 的例子,weightVector=[0.25 0.5 0.7]; 的和不等于 1,因此它的值不代表元素的概率。这种情况下的实际概率是[0.25 0.5 0.7] / 1.45
    • @JB 我已经编辑了答案,以便权重总和为 1。谢谢。
    【解决方案2】:

    您所描述的类似于广义伯努利分布。因此,您可以使用多项分布来生成此数据。

    MATLAB 帮助页面是here

    在你的情况下,n=1p=[.25 .35 .4]

    mnrnd(n,p)
    

    将返回一个1 x 3 向量,它只有一个非零元素,对应于应选择的随机变量。


    TL;DR 版本:

    要生成所需的输出,您只需执行dot([1 3 7], mnrnd(1,[.25 .35 .4]))

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      相关资源
      最近更新 更多