MATLAB:人口随机抽样多次?

时间:2015-09-26 19:11:34

标签: matlab functional-programming statistics probability

我知道MATLAB的datasample允许从某个k中选择population次。假设population=[1,2,3,4]我希望从中进行统一抽样,替换为k=5次。然后:

datasample(population,k)
ans =
   1     3     2     4     1

现在,我想在不使用for循环的情况下重复上述实验N=10000次。我试过了:

datasample(repmat(population,N,1),5,2)

但我得到的输出(下面只是一个简短的摘录):

 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3
 1     3     2     1     3

每一行(实验结果)都是一样的!但显然它们应该是不同的...就好像一些随机种子不在行之间更新。我怎样才能解决这个问题?或者我可以使用的其他方法避免for循环?谢谢!

3 个答案:

答案 0 :(得分:5)

您似乎对datasample的工作方式感到困惑。如果您在函数上阅读documentation,如果指定矩阵,它将从矩阵中的选定行生成数据采样。因此,如果您只是重复population向量10000次,并且指定函数的第二个参数 - 在这种情况下是要提取的矩阵行数,即使实际行位置本身不同,所有矩阵上的实际行将是相同的,这就是为什么你得到那个"错误"。

因此,如果你打算避免循环,我不会在这里使用datasample。您可以使用datasample,但是您必须循环每次通话,并明确表示这不是您想要的。

我建议你做的是首先创建你的population向量以包含你想要的任何东西,然后生成一个随机索引矩阵,其中每个值介于1到{{{}之间的元素之间。 1}}。该矩阵以这样的方式,其中列数是样本数,行数是试验数。创建此矩阵后,只需使用它来索引矢量即可获得所需的采样矩阵。要生成此随机索引矩阵,randi是一个不错的选择。

想到这样的事情:

population

这是输出的前10行:

N = 10000; %// Number of trials
M = 5; %// Number of samples per trial
population = 1:4; %// Population vector

%// Generate random indices
ind = randi(numel(population), N, M);

%// Get the stuff
out = population(ind);

我认为上面做了你想要的。还要记住,上面的代码概括为您想要的任何人口向量。您只需更改向量,它就会像宣传的那样工作。

答案 1 :(得分:4)

datasample将您数据的每一列解释为您的人口中的一个元素,在所有列中进行抽样。

要解决此问题,您可以循环调用datasample N次,而不是randi

population(randi(numel(population),N,5))

假设您的人口总是1:p,您可以简化为:

randi(p,N,5)

答案 2 :(得分:3)

好的,所以当前的答案都说不要使用datasample而是使用randi。不过,我为您提供了datasamplearrayfun的解决方案。

>> population = [1 2 3 4];
>> k = 5; % Number of samples
>> n = 1000; % Number of times to execute datasample(population, k)
>> s = arrayfun(@(k) datasample(population, k), n*ones(k, 1), 'UniformOutput', false);
>> s = cell2mat(s);
s =

     1     4     1     4     4
     4     1     2     2     4
     2     4     1     2     1
     1     4     3     3     1
     4     3     2     3     2

我们需要确保将'UniformOutput', falsearrayfun一起使用,因为有多个输出。由于cell2mat是一个单元格数组,因此需要arrayfun调用。