У меня есть 151-на-151 матрица A
. Это корреляционная матрица, поэтому на главной диагонали есть 1
и повторяющиеся значения выше и ниже главной диагонали. Каждая строка/столбец представляет человека.
Для заданного целого числа n
я попытаюсь уменьшить размер матрицы, выбив людей, так что я остался с корреляционной матрицей n-by-n
, которая минимизирует общую сумму элементов. В дополнение к получению сокращенной матрицы мне также нужно знать номер строки людей, которые должны быть загружены из исходной матрицы (или их номер столбца - они будут того же номера).
В качестве отправной точки возьмите A = tril(A)
, который удалит избыточные недиагональные элементы из корреляционной матрицы.
Итак, если n = 4
и мы имеем гипотетическую матрицу 5 на 5, то очень ясно, что человека 5 следует выталкивать из матрицы, поскольку этот человек вносит очень много корреляций.
Также ясно, что человека 1 нельзя выталкивать, поскольку этот человек вносит много отрицательных корреляций и таким образом сбрасывает сумму матричных элементов.
Я понимаю, что sum(A(:))
будет суммировать все в матрице. Однако я не совсем понимаю, как искать минимально возможный ответ.
Я заметил аналогичный вопрос Поиск субматрицы с минимальной элементарной суммой, которая в качестве принятого ответа имеет решение грубой силы. Хотя этот ответ хорошо работает, это нецелесообразно для матрицы 151 на 151.
EDIT: Я думал об итерации, но я не думаю, что это действительно минимизирует сумму элементов в приведенной матрице. Ниже у меня есть корреляционная матрица 4 на 4, выделенная жирным шрифтом, с суммами строк и столбцов на краях. Очевидно, что при n = 2
оптимальной матрицей является матрица идентичности 2 на 2, в которую входят Лица 1 и 4, но в соответствии с итеративной схемой я бы выгнал Person 1 на первой фазе итерации, и поэтому алгоритм делает решение, которое не является оптимальным. Я написал программу, которая всегда создавала оптимальные решения, и она хорошо работает, когда n или k малы, но, пытаясь создать оптимальную матрицу размером 75 на 75 из матрицы 151 на 151, я понял, что моя программа займет миллиарды лет для прекращения.
Я смутно вспоминал, что иногда эти n выбирают k проблем, которые могут быть решены с помощью динамических подходов к программированию, которые не позволяют перекомпоновку вещей, но я не могу решить, как это решить, и нигде не просвещает меня.
Я готов пожертвовать точностью для скорости, если нет другого варианта, или лучшая программа займет больше недели, чтобы создать точное решение. Тем не менее, я рад позволить программе работать до недели, если она будет генерировать точное решение.
Если бы программа не могла оптимизировать матрицу в разумные сроки, я бы принял ответ, объясняющий, почему n выбирает k задач этого конкретного вида, не может быть разрешено в разумные сроки.