【问题标题】:How can I select random samples from several matrices in MATLAB?如何从 MATLAB 中的多个矩阵中选择随机样本?
【发布时间】:2017-07-07 06:26:55
【问题描述】:

使用 MATLAB,我有几个 8760x1 矩阵。我需要从第一个矩阵中随机选择一些数据,然后从其他矩阵中选择数据,但数据与从第一个矩阵中获得的位置相同,即

data1 = [a b c d e];
data2 = [f g h i j];

我datasample [a c d],然后我需要选择[f h i],按这个顺序,给我:

out1 = [a c d]
out2 = [f h i]

datasample 是最好的工具吗?或者我该怎么做? 谢谢。

【问题讨论】:

  • 对 data1 使用 datasample,同时捕获第二个输出。使用 datasample 的第二个输出来索引 data2 和其他。
  • 您是选择with还是without替换?
  • 我使用但没有成功,但@TonyTannous 提供的解决方案有效。但是,如果可能的话,我需要做一些更复杂的事情。我正确提取了 8760 个数字中的 6000 个,但我需要在剩余的 2760 个中随机提取更多的 1500 个,然后在第三个向量上提取剩余的 1260 个。
  • @rayryeng 他想要独一无二。

标签: matlab matrix sampling


【解决方案1】:

只要您使用非替换形式,Datasample 就会很好地发挥作用(我猜您不希望重复输出。如果您对此表示满意,则忽略“替换”标志)。索引输出也将是未排序的,因此您可以完美地将其用于 data2:

data1 = [a b c d e];
data2 = [f g h i j]
[out1,idx] = datasample(data1,k,'Replace',false);
out2=data2(idx);

我看到您还“需要仅从剩余的 2760 中随机提取更多的 1500,然后在第三个向量上提取剩余的 1260。”,您可以使用 idx 信息来忽略该集合:

idx_notused=setdiff(1:size(data1,1),idx); %finds all positions not selected previously
[out1_v2,idx2] = datasample(data1(idx_notused),k,'Replace',false); %k=1500
idx2=idx_notused(idx2); %so it maps with the original data
out2_v2=data2(idx2);

%and again for the remaining 1260:
idx_remaining=setdiff(1:size(data1,1),[idx idx2]);
out1_v3=data1(idx_remaining);
out2_v3=data2(idx_remaining);

【讨论】:

  • 谢谢!它工作完美。 @ana 如果您不介意,让我问您其他问题:如果输入 data18760x2 而不是 8760x1,正如我所尝试的那样,第一个数据采样工作正常,并返回 6000x2矩阵,然而,剩下的返回一个1500x1 和 1260x1`
  • 好的,通过将: 添加到(idx_notused,:) 来实现。谢谢!
【解决方案2】:
mat1 = [4, 3, 5, 4];
mat2 = [1, 1, 2, 2];

s = size(mat1);
[v] = randperm(s(2), 2); <--- remember the indices 


ret = mat1(v);
ret = [ret; mat2(v)];
enter code here


out1 = ret(1, 1:end);
out2 = ret(2, 1:end);

编辑

[v] is a 1/0 vector which represents the places chosen to pick from values. 
now to choose from the data left, we need to extract the data not picked and  
pick from it.

v2 = (1-v);
TempMat = Mat(v2);

TempMat is the remaining data not picked in first place.

【讨论】:

  • 想解释一下 randperm 上的 2 代表什么?
  • @Paulos,是的,抱歉...s(2) 是向量的大小,2 是我想要选择的值的数量。你可以输入任何你想要的数字randperm(s(2), n) 而不是 n。只要它小于或等于向量中的值的总数。
  • 我在那里收到k&gt;nerror 但我注意到我的输入数据确实是8760x1 而不是1x8760 所以,我放置了randperm(s(1), n)。然后我不得不在ret 上转置mat1(v)mat2(v) 来修复它。不知道有没有更简单的方法来“修复”它。
  • 知道我应该如何对相同的输入数据再次进行采样,现在值更少但在剩余/未采样的单元上?谢谢!
【解决方案3】:

我相信以下解决方案将满足您的需求。在向量 k2 中,您将有 n 个不同的索引用于您想要的矩阵中。

k1=randperm(length(data1)); 
k2=k1(1:n)    % row of n samples
out1=data1(k2);
out2=data2(k2);

【讨论】:

    【解决方案4】:

    对于不重复的采样,您可以使用randperm,您从大约 1500 个元素的“块”中的相同数据中重新采样这一事实不会改变您不重复采样的基本事实。因此,您只需将所有数据重新排序,然后将其重塑为您想要的大小:

    data1 = ('abcdewryt').';
    data2 = ('fghijvbnm').';
    k = 2; % samlpe size
    N = 3; % no. of times to resample
    rand_ind = randperm(size(data1,1)); % reorder all your data
    out1 = reshape(data1(rand_ind(1:k*n)),[k,n]); % extract output from data1 in a shuffled order
    out2 = reshape(data2(rand_ind(1:k*n)),[k,n]); % extract output from data2 in a shuffled order
    left1 = data1(rand_ind(k*n+1:end)); % all what's left in data1
    left2 = data1(rand_ind(k*n+1:end)); % all what's left in data2
    

    现在您在outs 的每一列中都有数据样本,并且您有N 列用于重新采样数据N 次。原始向量中剩下的所有内容都在lefts 中。

    结果示例:

    out1 =
    ywb
    det
    out2 =
    nvg
    ijm
    left1 =
    a
    r
    c
    left2 =
    a
    r
    c
    

    【讨论】:

    • 我的答案与你的相似有什么问题? + 他想从剩余的数据中提取另一个样本。
    • @TonyTannous 你说得对,我在发布后注意到了他的另一个问题,但没有时间解决它。
    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2015-09-06
    • 2019-05-10
    • 2016-02-15
    相关资源
    最近更新 更多