Квантильная сортировка в Matlab

У меня есть вектор n на 1, где n = 20000. Я хотел бы сделать децильное ранжирование данных в этом векторе, которое в основном заменяет значение каждого элемента соответствующим децилем.

В настоящее время я делаю это следующим образом:

deciles = quantile(X,9);
X = discretize(X,[-inf deciles inf]);

Где X - мой массив данных. Я делаю это, потому что хочу иметь 10 групп данных с одинаковым номером в каждой из них.

Можете ли вы проверить эту процедуру или сообщить мне, есть ли более надежный способ сделать это?


person Tulkkas    schedule 11.05.2016    source источник
comment
Вы можете легко проверить это самостоятельно — просто создайте небольшой образец X и посмотрите, получите ли вы правильные результаты. Одна вещь, которую я бы посоветовал сразу, это не делать это на месте. то есть не переопределяйте X, а создайте новую переменную, скажем, X_dec, чтобы вы могли сравнить ее с X, что поможет вам в самопроверке вашей процедуры.   -  person Dan    schedule 11.05.2016
comment
Да, я уже сделал это, и это отлично работает для небольшого образца. Но иногда при работе с огромным набором данных могут возникнуть проблемы! Просто хотел услышать от других, имеет ли это смысл или есть ли другой способ сделать это! Но спасибо за комментарий!   -  person Tulkkas    schedule 11.05.2016


Ответы (1)


Вы можете легко проверить правильность того, что у вас есть, создав простые данные известного размера.

nGroups = 10;
nPerGroup = 10000;

X = linspace(0, 1, nGroups * nPerGroup);

deciles = quantile(X, nGroups - 1);
X = discretize(X,[-inf deciles inf]);

nPerGroup = arrayfun(@(x)sum(X == x), 1:nGroups)
%// 10000   10000   10000   10000   10000   10000   10000   10000   10000   10000

Другой альтернативой является сортировка данных, а затем изменение формы так, чтобы количество столбцов соответствовало количеству желаемых групп. Этот подход будет полагаться только на встроенные функции

X = linspace(0, 1, nGroups * nPerGroup);
Y = reshape(sort(X), [], nGroups);

Каждый столбец представляет собой отдельную группу.

person Suever    schedule 11.05.2016