MATLAB:人口随机抽样多次?

spa*_*ger 3 statistics matlab functional-programming probability

我知道MATLAB datasample允许选择k某个时间population.假设population=[1,2,3,4]并且我想要k=5从替换中对其进行统一采样.然后:

datasample(population,k)
ans =
   1     3     2     4     1
Run Code Online (Sandbox Code Playgroud)

现在,我想重复上述实验N=10000,而不使用for循环.我试过做:

datasample(repmat(population,N,1),5,2)
Run Code Online (Sandbox Code Playgroud)

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

 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
Run Code Online (Sandbox Code Playgroud)

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

ray*_*ica 5

你的工作方式似乎令人困惑datasample.如果您阅读有关该函数的文档,如果指定矩阵,它将从矩阵中的选定行生成数据采样.因此,如果您只是重复population10000次向量,并且指定函数的第二个参数 - 在这种情况下是要提取的矩阵的行数,即使实际的行位​​置本身不同,实际的行也会超过所有矩阵都是相同的,这就是你得到"错误"的原因.

因此,datasample如果您打算避免循环,我不会在这里使用.你可以使用datasample,但你必须遍历每个电话,你明确地说这不是你想要的.

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

想到这样的事情:

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);
Run Code Online (Sandbox Code Playgroud)

这是输出的前10行:

>> out(1:10,:)

ans =

     4     3     1     4     2
     4     4     1     3     4
     3     2     2     2     3
     1     4     2     2     2
     1     2     3     4     2
     2     2     3     2     1
     4     1     3     2     4
     1     4     1     3     1
     1     1     2     4     4
     1     2     4     2     1
Run Code Online (Sandbox Code Playgroud)

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