Если бы у меня была матрица, подобная приведенной ниже:
X = [...
1 2 3;
1 4 5;
1 6 7;
1 8 9;
0 10 11;
0 12 13;
1 14 15]
и я хотел равномерно распределить содержимое, поэтому у меня было что-то вроде этого, где 0s
в первом столбце довольно равномерно распределены по всему набору данных, но строки остаются вместе:
Y = [...
1 2 3;
1 4 5;
0 10 11;
1 6 7;
1 8 9;
0 12 13;
1 14 15]
(Обратите внимание, что это вымышленный пример, я использую гораздо больший набор данных)
Что я имею в виду для равномерного распределения, так это то, что если бы я разбил набор данных, я бы хотел одинаковое соотношение 1 к 0 независимо от того, где я разделил набор данных. Итак, если в первых 5 строках данных было 4 единицы и 1 ноль, я бы хотел, чтобы в следующих 10 строках данных было 8 единиц и 2 нуля.
@CrisLuengo, что я имею в виду под равномерно распределенным, так это то, что если бы я разбил набор данных, я бы хотел, чтобы отношение 1 к 0 было одинаковым, независимо от того, где я разделил набор данных. Итак, если в первых 5 строках данных было 4 единицы и 1 ноль, я бы хотел, чтобы в следующих 10 строках данных было 8 единиц и 2 нуля.
Но что, если вы не можете разделить количество строк на количество нулей?
Это не должно быть точным, просто рассредоточьтесь как можно лучше.
Если вы просто хотите перемещать строки случайным образом, вы можете использовать randperm
:
Y = X(randperm(size(X, 1)), :)
Y = 1 8 9 0 12 13 1 14 15 1 4 5 0 10 11 1 2 3 1 6 7
Хотя можно ожидать, что 0 и 1 будут распределены почти равномерно, если имеется большое количество строк, это не гарантируется.
Они могут быть распределены равномерно только в том случае, если количество нулей и единиц равно. В этом случае их можно расположить по очереди:
X = [...
1 2 3;
1 4 5;
0 6 7;
1 8 9;
0 10 11;
0 12 13;
1 14 15];
Y= zeros(size(X));
Y(1:2:end, :) = X(X(:, 1)==1, :);
Y(2:2:end, :) = X(X(:, 1)==0, :)
Y = 1 2 3 0 6 7 1 4 5 0 10 11 1 8 9 0 12 13 1 14 15
Но в вашем случае, когда количество 0 и 1 не равно, вы можете комбинировать вышеуказанные методы. Например, в вашем тестовом примере сначала расположите поочередно две единицы и два нуля, а затем распределите 3 оставшиеся единицы случайным образом (для реализации были предприняты противоположные шаги):
Y = zeros(size(X));
I0 = find(~X(:, 1));
n0 = length(I0);
I1 = find(X(:, 1));
n1 = length(I1);
nRandom = abs(n0-n1);
nAlter = min(n0, n1);
filled = randperm(size(X, 1), nRandom);
if n0 > n1
Y(filled, :) = X(I0(nAlter+1:end), :);
else
Y(filled, :) = X(I1(nAlter+1:end), :);
end
empty = setdiff(1:size(X, 1), filled);
Y(empty(1:2:nAlter*2), :) = X(I1(1:nAlter), :);
Y(empty(2:2:nAlter*2), :) = X(I0(1:nAlter), :)
Самый простой способ обеспечить некоторую однородность в распределении подмножеств данных — отсортировать строки (см. sortrows
), а затем разделить данные по чередующимся строкам. Например, разделить на 3 равные группы:
X = sortrows(X);
X1 = X(1:3:end,:);
X2 = X(2:3:end,:);
X3 = X(3:3:end,:);
Однако это смещает закаты: X1
всегда имеет меньшие значения, чем X2
и т. д.
Что значит «равномерно распределить»? Это очень расплывчатое описание. Это случайная перетасовка? Или есть конкретное определение для распространения нулей?