MATLAB: выборка с одинаковым количеством значений из каждого класса

У меня есть полный набор данных, скажем, 50000 наблюдений, которые относятся к 16 классам. Теперь я хочу нарисовать образец, скажем, 70% полных данных, но я хочу, чтобы MATLAB взял одинаковое количество образцов из каждого класса (если возможно, конечно, потому что некоторые классы имеют меньше чисел, чем необходимо)

Есть ли функция MATLAB, которая может это сделать, или мне нужно запрограммировать новую для себя? Я просто пытаюсь сэкономить время здесь.

Я нашел cvpartition, но, насколько мне известно, его можно использовать только для получения выборки с тем же распределением по классам, что и исходный набор данных, а не равномерно распределенной выборки.

Спасибо за помощь!


person mischa.mole    schedule 27.03.2013    source источник
comment
Для небольших групп вы можете попробовать каждое значение более одного раза. По крайней мере, это даст вам равное количество наблюдений в группе.   -  person Dennis Jaheruddin    schedule 27.03.2013
comment
возможный дубликат Загрузить все изображения из каталога   -  person Iswanto San    schedule 28.03.2013


Ответы (1)


Это не должно быть слишком сложно. Допустим, наблюдения находятся в векторе 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, которые сообщат ему о замене каждого наблюдения после выбора.

person Chris Taylor    schedule 27.03.2013
comment
Спасибо, сэкономил мне время на размышления :-) Я просто подумал, может быть, есть встроенная функция Matlab, которая может это сделать .... BR, Миша - person mischa.mole; 27.03.2013