在MATLAB中对数据进行抽样

4
我有两个数据。一个是实际的 fulldata ,它是一个49625x6数字数据集,另一个是该数据的目标类别为 Book2 的索引,大小为49625x1。
Book2有六个名称(字符串),一遍又一遍地重复以匹配fulldata数据集条目。我想从fulldata中取出1000个样本,其中1000个样本的25%是“蓝色”,75%是“红色”,并使用Book2将其包含在名为 sampledata 的新子样本中。
如何在MATLAB中实现这一点?
伪代码:
从Book2中选择250个蓝色样本,不确定如何“选择”250个随机的“蓝色”样本 bluesample = indX(Book2,:) Book2(indX,:)不确定。
再次从Book2中选择750个红色样本,同样不确定如何“选择”750个随机的“红色”样本 redsample = indX(Book2,;) Book2(indX,:)在这里也不确定。
将蓝色和红色样本组合成子样本。
subsample = join(bluesample, redsample)

找到子样本的索引,从完整数据中创建样本数据:

sampledata = subsample(indX(fulldata), :) This line is probably wrong

这是两个数据集的图片:
每一行在Book2中都与fulldata中的一行匹配。我想通过使用Book2,选择一定数量的“正常”和一定数量的“异常”(是的,我知道它们的命名不合适)数据从fulldata中提取出来,因为Book2是fulldata的索引并包含类标签。
因此,在我的数据集方面,可以这样更容易地说:
Choose 250 random samples of the string "normal." from Book2 and log the row number.
Choose 750 random samples of the string "not normal." from Book2 and log the row number.
Combine the two random samples of row numbers together.
Make a new dataset (1000x6) using the combined row numbers (above) of fulldata.

我还没有尝试过任何东西,Ben :( 我不经常使用Matlab,所以只需要在这方面得到帮助。通常我会尝试,但我不知道如何使用循环等。 - G Gr
但我不知道如何使用循环等,请查阅Matlab教程。此外,问题有点模糊,这些表中是否有红色和蓝色的字符串?可以举一些表格的例子,并展示您想要做什么。 - Fantastic Mr Fox
2
@Ben,不确定这是否为您澄清了一些事情。我也提到了Book2有6个“名称”,因此它们是字符串。 - G Gr
1
是的,这对问题来说是一个很好的改变,现在更清晰了。 - Fantastic Mr Fox
1个回答

1

使用strmatch提取“正常”的记录:

normIdx = strmatch('normal.', Book2);
normalSubset = fulldata(normIdx, :);

然后我谷歌搜索“matlab生成不重复随机整数列表”,从第一个结果中得到了一个包含250个随机不重复整数的列表:

p = randperm(size(normalSubset , 1));
p = p(1:250)-1;

现在,要获取您随机选择的250个正常记录

normalSample = normalSubset (p, :);

normalSample 将是 250 x 6。现在用“不正常”的方式做同样的事情,以获得一个 notNormalSample(750 x 6),然后将它们组合起来得到

sample = [normalSample ; notNormalSample ]

因此,在sample中,所有的正常值都会出现在非正常值之前,如果您想混合它们,请再次使用randperm()

sample = sample(randperm(1000), :);

嗨,丹,最后一行有点错误,这只会选择1000x1而不是1000x6。尽管我接受了你的答案,但你可能需要为其他人查看问题进行更正。 - G Gr

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