У вас есть матрица i на j. Для целей этого примера возьмем следующую (очень маленькую) матрицу. Однако алгоритм должен быть быстрым и масштабируемым.
values <- c(2,5,3,6,7,
9,5,4,9,9,
1,5,4,8,1,
3,1,5,6,2,
2,9,4,7,4)
my.mat <- matrix(values, nrow = 5, byrow = TRUE)
Цель: Итеративно удалить строки или столбцы из my.mat таким образом, чтобы значение mean(c(apply(my.mat, 1, min), apply(my.mat, 2, min))) было минимизировано с учетом количество строк и столбцов удалить. Делайте это жадно (чтобы после удаления столбца или строки они никогда не возвращались в матрицу). Другими словами, просто удалите строки или столбцы с наибольшим минимальным значением. Применяются следующие предостережения.
Во-первых, если удаление строки или столбца изменяет минимальное значение столбца или строки (т. е. если они являются минимальными значениями друг друга), удалите пару (строка, столбец). Если строка или столбец соединены с несколькими столбцами или строками, последовательно удаляйте дополнительные столбцы или строки до тех пор, пока соотношение не станет равным 1:1, а затем одновременно удалите оставшуюся пару. Во-вторых, там, где есть связи, выберите случайным образом.
Вывод: вектор, указывающий порядок удаления в соответствии с этой целью. Он может ссылаться либо на имена строк/столбцов, либо на значения ячеек, если это подразумевает правильный порядок удаления.
Таким образом, для приведенной выше матрицы правильный ответ...
(Column 4), (Row 2), (Column 3), (Either Row 1 or Row 5), (Row 5 or Row 1), (Column 1 or Column 5), (Row 4 and Column 2), (Column 5 or Column 1 AND Row 3)
Однако фактическая реализация не должна быть неопределенной. Например, он должен случайным образом выбрать строку 5 или строку 1, а затем удалить оставшуюся строку на более позднем этапе, когда это необходимо.
Очень легко представить очень корявое решение проблемы. Однако трудно представить себе быстрое векторизованное решение.
Если бы не было связей, в которых столбцы и строки не были бы связаны друг с другом, и если бы не было экземпляров нескольких строк или столбцов, соединенных с одним столбцом или строкой, вы могли бы просто отсортировать уникальные минимумы строк и столбцов, а затем итеративно удалить строки и столбцы с минимальными значениями, равными i-му значению в отсортированных минимумах. Однако, когда есть связи, как в my.mat, это ломается, потому что это приведет к ненужному удалению строк и столбцов, которые не изменяют минимумы соответствующего столбца или строки. Например, если строка соединена с двумя столбцами, все они будут иметь одинаковые минимумы, поэтому этот грубый алгоритм удалит строку и оба столбца, когда правильный ответ состоит в том, чтобы удалить наугад один из столбцов, а затем удалить оба. остальные столбец и строка. Одним из возможных решений этой проблемы является дрожание значений таким образом, чтобы подразумевался правильный порядок, но по мере того, как матрица становится большой, становится трудно гарантировать, что дрожание не приведет к неправильному порядку.
РЕДАКТИРОВАНИЕ 1: объяснение примера
Эндрю Макдональд задал вопрос о примере, поэтому я объясню порядок.
Минимумы для каждой строки и столбца следующие, где Ci, Ri — i-ые столбцы, строки.
C4 R2 C3 R1 R5 R3 R4 C1 C2 C5
6 4 3 2 2 1 1 1 1 1
Первые три шага просты. C4, R2 и C3 не являются минимумами для других строк или столбцов, а также нет ничьих. Итак, шаги 1-3...
Полная матрица:
C1 C2 C3 C4 C5
R1 2 5 3 6 7
R2 9 5 4 9 9
R3 1 5 4 8 1
R4 3 1 5 6 2
R5 2 9 4 7 4
1) Удалите C4.
C1 C2 C3 C5
R1 2 5 3 7
R2 9 5 4 9
R3 1 5 4 1
R4 3 1 5 2
R5 2 9 4 4
2) Удалить R2
C1 C2 C3 C5
R1 2 5 3 7
R3 1 5 4 1
R4 3 1 5 2
R5 2 9 4 4
3) Удалить C3
C1 C2 C5
R1 2 5 7
R3 1 5 1
R4 3 1 2
R5 2 9 4
Затем есть ничья между R1 и R5 (у обоих минимум 2). Они, очевидно, не связаны друг с другом и не являются минимумами для каких-либо столбцов, поэтому мы можем удалять их по одному, не изменяя минимумы какой-либо другой строки или столбца. Мы случайным образом выбираем между двумя, чтобы определить порядок.
4) Ряд 1 или Ряд 5 (я произвольно выберу ряд 1)
C1 C2 C5
R3 1 5 1
R4 3 1 2
R5 2 9 4
5) Ряд 5 или Ряд 1 (в зависимости от того, что не было выбрано на шаге 4)
C1 C2 C5
R3 1 5 1
R4 3 1 2
Остальные строки и столбцы связаны = 1. Вы не можете удалить R3, потому что тогда C1 или C5 станут хуже. Но вы можете удалить либо C1, либо C5 и не сделать R3 хуже. Точно так же вы не можете удалить R4 или C2, не ухудшив другой. Так что нам придется удалить R4 и C2 одновременно.
Последними несколькими шагами являются удаление одного из C1 или C5, затем оставшихся двух пар (R4 и C2, R3 и оставшихся либо C1 ИЛИ C5).
6) C1 или C5 (я выберу C5 произвольно)
C1 C2
R3 1 5
R4 3 1
7) R4 и C2
C1
R3 1
8) R3 и остальные C1 или C5
[]
ПРИМЕЧАНИЕ. Шаги 7 и 8 на самом деле взаимозаменяемы. Опять же, случайным образом выберите между ними.
(Column 1 or Column 5 or Column 2)
? - person AndrewMacDonald   schedule 10.07.2014