4

我有两条数据。一个是实际的fulldata,它是 49625x6 数字数据的数据集,另一个是该数据的索引,其 target_class 命名Book2为 49625x1。

Book2 有六个名称(字符串)一遍又一遍地重复以匹配 fulldata 数据集条目。我想使用 Book2 从 fulldata 中提取 1000 个样本,其中 1000 个样本中有 25% 是“蓝色”,75% 是“红色”,然后将其包含在一个名为sampledata.

如何在 MATLAB 中实现这一点?

伪代码:

从 Book2 中选择 250 个蓝色样本,不确定如何“选择”250 个随机“蓝色”样本 bluesample = indX(Book2, :)Book2(indX, :)不确定。

从 Book2 中选择 750 个红色样本,再次不确定如何“选择”750 个随机“红色”样本 redsample = indX(Book2, ;),或者Book2(indX, :)在这里再次不确定。

将蓝色和红色样本组合成子样本。

subsample = join(bluesample, redsample)

找到 subsample 的索引并从 fulldata 创建 sampledata:

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.
4

1 回答 1

1

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

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

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

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), :);
于 2012-11-13T07:40:40.980 回答