У меня большой массив (приблизительно 250 000 x 10). Каждая строка содержит 1s или -1s. Например:
data(1, :) = [1, -1, -1, -1, -1, -1, -1, -1, 1, -1];
Мне нужно выбрать наборы из n строк, чтобы среднее значение абсолютных сумм столбцов было минимизировано (как можно ближе к нулю). Итак, в этом примере игрушек, где n = 2:
[ 1 1 1 1]
[-1 -1 -1 -1]
[-1 1 -1 1]
Я бы выбрал строки 1 и 2, поскольку они суммируются до [0 0 0 0] (среднее значение 0), что является минимальным возможным при n = 2.
Я попробовал предложенный ниже метод (найти дополнительные пары), но для моего набора данных это может только сформировать сбалансированное подмножество из 23 тыс. строк. Итак, мне нужна аппроксимация, которая генерирует подмножество размером n строк, но с минимальными средствами абсолютных сумм столбцов.
Лучший подход, который я нашел до сих пор, заключается в следующем: выберите начальное подмножество, итеративно добавьте каждую строку из остальной части в базу и сохраните ее, если она улучшит среднее значение абсолютных сумм столбцов. Это очень грубо, и я уверен, что есть лучшие способы. Он также склонен зависеть от ложных минимумов, поэтому необходимо добавить непредвиденные обстоятельства:
shuffle = randperm(size(data));
data_shuffled = data(shuffle, :);
base = data_shuffled(1:30000, :);
pool = data_shuffled(30001:end, :);
best_mean = mean(abs(sum(base, 1)));
best_matrix = base;
n = 100000;
for k = 1:20
for i = 1:size(pool, 1)
temp = pool (i, :);
if(~isnan(temp(1)))
temp_sum = sum(temp, 1);
new_sum = temp_sum + sum(best, 1);
temp_mean = mean(abs(new_sum));
if(temp_mean < best_mean)
best_mean = temp_mean;
best_matrix = vertcat(best_matrix, temp);
pool(i, :) = NaN(1, 10);
end
end
end
if(size(best_matrix, 1) > n)
return
end
end
Это достигает среднего значения абсолютных сумм столбцов ~ 17 000, что не так уж плохо. Повторение с разными семенами, вероятно, немного улучшит его.
В идеале, вместо того, чтобы просто добавлять новый элемент в конец best_matrix, я бы заменил его на какой-то элемент, чтобы добиться наилучшего улучшения.
Обновление: я не хочу выделять конкретные данные набора данных, потому что все решения должны быть применимы к любым матрицам в указанном формате.
Спасибо всем, кто внес свой вклад!