1

下面是一个从数据集中选择一组随机排列的例子,我如何用剩余的数据创建一个新的数据集。例如下面我选择 49402(大约 10%)并创建一个以此命名的数据集UnseenTestdata,我希望其余的进入一个名为testdata.

pointsToPick = 49402;  %# Numbers to pick
rVec = randperm(494021);   %# Random permutation of datapoint indices (N=494021 in this case)  

UnseenTestdata = fulldata(rVec(1:pointsToPick),:); %# Random sample

Unseentestdata 减去 fulldata = 恰当命名为 testdata 的数据集的剩余部分。

fulldata 集的维度是 494021x6,我从 fulldata 中随机选择 49402x6。然后我需要从 fulldata 中减去 unseentestdata 剩下的内容。

Barnabas Szabolcs 添加了以下测试用例答案:

fulldata = [1 2; 3 4; 5 6; 7 8];
rVec = randperm(4);  
pointsToPick=2;
unseen = fulldata(rVec(1:pointsToPick),:); 
testdata = fulldata(rVec(pointsToPick:length(rVec)),:); 

但是这不起作用,我已经屏幕转储了结果:

在此处输入图像描述

如果您在屏幕转储中注意到未见过的数据 = 3,4 和 7,8,但是如果您在 testdata 中注意到 7,8 仍然存在。

如果完整数据 =

1,2
3,4
5,6
7,8

在这种情况下,我们选择两个随机行,看不见的行是:

row
3,4
7,8

那么剩下的应该是:

1,2
5,6

但是,如果您在示例测试 testdata 的屏幕转储中注意到该行:

7,8

表明示例测试不起作用。

4

1 回答 1

0

如果我正确理解您的问题,解决方案是

testdata = fulldata(rVec((pointsToPick+1):length(rVec)),:);

简单的测试用例:

fulldata = [1 2; 3 4; 5 6; 7 8;10 9];
rVec = randperm(4);  // gives me first time [4 2 3 1 5]
pointsToPick=2;
unseen = fulldata(rVec(1:pointsToPick),:); // [7 8; 3 4]
// length(rVec) is 5
testdata = fulldata(rVec((pointsToPick+1):length(rVec)),:); // [5 6; 1 2; 10 9]

从某种意义上可以清楚地看到fulldata= unseen(setplus) testdata。请注意,我们需要“+1”,因为与 c++ 中的说法不同,数组是从一个向上索引的,所以最后一个索引length不是length-1.

您可以使用以下方法验证事情是否正确:

 isequal(sort([unseen; test]), sort(full_data)) // should be true
于 2012-11-17T11:49:26.687 回答