【问题标题】:How to select random samples from a dataset in Matlab [duplicate]如何从Matlab中的数据集中选择随机样本[重复]
【发布时间】:2012-11-16 05:22:24
【问题描述】:

可能重复:
How do I randomly select k points from N points in MATLAB?

假设我有一个包含 10,000 行数据的数据集。创建包含 1,000 个随机选择的行的子集的最佳方法是什么?

【问题讨论】:

    标签: matlab octave random-sample


    【解决方案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 个随机整数序列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-17
          • 2014-09-15
          • 1970-01-01
          • 2017-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多