MATLAB:从每个类中获取具有相同数量值的样本

时间:2013-03-27 10:16:35

标签: matlab statistics distribution sampling

我有一个完整的数据集,可以说50000个观测值,分配给16个类。 我现在想要绘制一个样本,让我们说70%的完整数据,但我希望MATLAB从每个类中获取相同数量的样本(如果可能的话,因为有些类的数量少于所需的数量)

是否有MATLAB功能可以做到这一点,还是我必须为自己编写一个新的功能?我只想在这里节省时间。

我找到了cvpartition,但据我所知,这只能用于在类上采用与原始数据集相同的分布,而不是均匀分布的样本。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

不应该太难。假设观察结果位于向量observations中。然后就可以了

fraction = 0.7;

classes = unique(observations);
nObs = length(observations);
nClasses = length(classes);
nSamples = round(nObs * fraction / nClasses);

for ii = 1:nClasses
    idx = observations == classes(ii);
    samples((ii-1)*nSamples+1:ii*nSamples) = randsample(observations(idx), nSamples);
end

现在samples是一个长度为nClasses * nsamples的向量,其中包含您的采样观察结果,每个类别的数字相同。

如果其中一个类至少包含nSamples个观察值,它将会失败。最简单的解决方法是将额外的参数'replace','true'添加到randsample的调用中,这将告诉它在被挑选后替换每个观察。