【发布时间】:2014-03-24 11:46:31
【问题描述】:
Matlab/Octave 上是否有任何函数可以根据给定的概率从列表中随机选择一个值?
例如:我们有向量 [1 3 7]。我正在寻找的函数应该选择概率为 0.25 的 1、0.35 的 3 和 0.4 的 7 的数字之一。
我正在尝试自己实现它,但我想知道是否有一些内置功能,以便下次我需要这样的东西时使用。
【问题讨论】:
Matlab/Octave 上是否有任何函数可以根据给定的概率从列表中随机选择一个值?
例如:我们有向量 [1 3 7]。我正在寻找的函数应该选择概率为 0.25 的 1、0.35 的 3 和 0.4 的 7 的数字之一。
我正在尝试自己实现它,但我想知道是否有一些内置功能,以便下次我需要这样的东西时使用。
【问题讨论】:
您正在寻找一个名为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 听起来很完美,非常感谢 :-)
weightVector=[0.25 0.5 0.7]; 的和不等于 1,因此它的值不代表元素的概率。这种情况下的实际概率是[0.25 0.5 0.7] / 1.45。
您所描述的类似于广义伯努利分布。因此,您可以使用多项分布来生成此数据。
MATLAB 帮助页面是here。
在你的情况下,n=1 和 p=[.25 .35 .4]。
mnrnd(n,p)
将返回一个1 x 3 向量,它只有一个非零元素,对应于应选择的随机变量。
TL;DR 版本:
要生成所需的输出,您只需执行dot([1 3 7], mnrnd(1,[.25 .35 .4]))
【讨论】: