我有一个完整的数据集,可以说50000个观测值,分配给16个类。 我现在想要绘制一个样本,让我们说70%的完整数据,但我希望MATLAB从每个类中获取相同数量的样本(如果可能的话,因为有些类的数量少于所需的数量)
是否有MATLAB功能可以做到这一点,还是我必须为自己编写一个新的功能?我只想在这里节省时间。
我找到了cvpartition
,但据我所知,这只能用于在类上采用与原始数据集相同的分布,而不是均匀分布的样本。
感谢您的帮助!
答案 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
的调用中,这将告诉它在被挑选后替换每个观察。