如何在Matlab中从数据集中选择随机样本

24
4个回答

34
你可以使用randperm来完成这个任务:
无重复的随机抽样:
nRows = 10000; % number of rows
nSample = 1000; % number of samples

rndIDX = randperm(nRows); 

newSample = data(rndIDX(1:nSample), :); 

重复抽样:

nRows = 10000; % number of rows
nSample = 1000; % number of samples

rndIDX = randi(nRows, nSample, 1); 

newSample = data(rndIDX, :); 

1
你能展示一下无重复抽样的例子吗?谢谢! - robguinness
1
@robguinness:实际上,这个例子是无重复抽样。 - H.Muster
1
好的,现在我阅读了randperm的文档,这就有意义了。那么,如果要进行替换抽样,我需要使用randi吗? - robguinness
@robguinness:是的,对于有放回抽样,可以使用randi。我需要在我的答案中添加一个代码示例吗? - H.Muster
我看到你已经这样做了,谢谢!顺便说一句,我最终在我的代码中使用了统计工具箱中的randsample,但我认为你的答案对于那些没有该工具箱的人也很有用。此外,它们基本上使用相同数量的代码行执行相同的操作。 - robguinness

6

使用randperm与行数相结合。如果x是您的矩阵:

nrows = size(x,1);
nrand = 1000; % Choose 1000 rows
assert(nrand<=nrows, 'You cannot choose more rows than exist in the matrix');
rand_rows = randperm(nrows, nrand);
xx = x(rand_rows,:);  % Select the random rows from x

3
如果您有统计工具箱R2012+,您可以使用datasample。 点击此处 了解更多信息。
subset = datasample(data,1000)

subset 将是由1000个样本组成的随机选择数据子集。

要进行无重复采样,请使用:

subset = datasample(data,1000,'Replace',false)

如果您使用较早版本的工具箱,可以使用randsample: randsample。该函数与文本中提到的功能相同。
rndIdx = randsample(size(data,1),1000,true); % with replacement
subset = samples(rndIdx(1:1000), :);

rndIdx = randsample(size(data,1),1000,false); % without replacement
subset = samples(rndIdx(1:1000), :);

但是使用randsample与H.Muster的答案基本相同(我已经接受了他的答案,因为它不需要任何工具箱)。

注意:有关使用放回抽样和不使用放回抽样之间的差异的更多信息,请参见此页面


1

不确定您是否已经编写了任何代码。以下mathworks链接显示了随机抽样的示例。可以查看它以获取想法。

此外,这里有一个使用统计工具箱中的randsample的代码。只是一个逻辑,您可能需要相应地进行调整。

矩阵m有N行

从m中随机抽取n行

Sample = m(randsample(1:N,n),:)

randsample(1:N,n)

上述结果是从1到N的n个随机整数序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接