如何从Matlab中的数据集中选择随机样本[重复]
Posted
技术标签:
【中文标题】如何从Matlab中的数据集中选择随机样本[重复]【英文标题】:How to select random samples from a dataset in Matlab [duplicate] 【发布时间】:2012-11-16 05:22:24 【问题描述】:可能重复:How do I randomly select k points from N points in MATLAB?
假设我有一个包含 10,000 行数据的数据集。创建包含 1,000 个随机选择的行的子集的最佳方法是什么?
【问题讨论】:
【参考方案1】:你可以使用 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, :);
【讨论】:
你能举一个不更换抽样的例子吗?谢谢! @robguinness:其实这个例子是无放回抽样。 好的,这是有道理的,现在我阅读了 randperm 的文档。因此,对于带有替换的采样,我会使用需要使用 randi 来代替? @robguinness:是的,它是randi
用于替换采样。我应该在我的答案中添加一个代码示例吗?
我看到你已经这样做了,谢谢!顺便说一句,我最终在我的代码中使用了统计工具箱中的 randsample,但我认为您的答案对那些没有该工具箱的人很有用。此外,它们基本上用相同的代码行数做同样的事情。【参考方案2】:
如果你有统计工具箱R2012+,可以使用datasample。
subset = datasample(data,1000)
subset
将是由 1000 个样本组成的随机选择的数据子集。
要在不更换的情况下进行采样,请使用:
subset = datasample(data,1000,'Replace',false)
如果你有旧版本的工具箱,可以使用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 的答案或多或少相同(我认为这是最好的,因为它不需要任何工具箱)。
注意:有关更多信息 带放回抽样与不带放样之间的区别 替换,见this page。
【讨论】:
【参考方案3】:将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
【讨论】:
【参考方案4】:不确定到目前为止您是否编写过任何代码。以下mathworks 链接显示了随机抽样的示例。看看它的想法。
这里还有一个来自统计工具箱的带有 randsample 的代码。只是一个逻辑,你可能需要相应地调整它。
N 行的矩阵 m 从 m 中抽取 n 行的随机样本
Sample = m(randsample(1:N,n),:)
randsample(1:N,n)
上面的结果是从 1 到 N 的 n 个随机整数序列。
【讨论】:
以上是关于如何从Matlab中的数据集中选择随机样本[重复]的主要内容,如果未能解决你的问题,请参考以下文章