Как равномерно распределить данные в матрице по столбцу?

Если бы у меня была матрица, подобная приведенной ниже:

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 нуля.

Что значит «равномерно распределить»? Это очень расплывчатое описание. Это случайная перетасовка? Или есть конкретное определение для распространения нулей?

Cris Luengo 12.12.2020 04:18

@CrisLuengo, что я имею в виду под равномерно распределенным, так это то, что если бы я разбил набор данных, я бы хотел, чтобы отношение 1 к 0 было одинаковым, независимо от того, где я разделил набор данных. Итак, если в первых 5 строках данных было 4 единицы и 1 ноль, я бы хотел, чтобы в следующих 10 строках данных было 8 единиц и 2 нуля.

Kel 12.12.2020 21:36

Но что, если вы не можете разделить количество строк на количество нулей?

Cris Luengo 12.12.2020 22:41

Это не должно быть точным, просто рассредоточьтесь как можно лучше.

Kel 13.12.2020 21:41
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
4
265
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 и т. д.

Другие вопросы по теме