Сначала немного фона.Я нахожу собственные значения и собственные векторы реальной симметричной матрицы, в которой строки суммируются с 0. Более конкретно, когда я нахожу собственный вектор, я использую $ argsort $, чтобы найти перестановку, которая сортирует одно из собственных значений, и применить перестановку кисходная матрица.
Теперь я реализовал код на python, используя пакет numpy.Сам код является рекурсивным, и если он находит набор значений в собственном векторе, которые равны, он извлекает симметричную подматрицу, соответствующую индексам, для которых у нас равные значения, и снова применяет алгоритм к этой матрице.
Хотя все это очень хорошо, и в основном это грубая работа, я был удивлен, когда группа индексов, которые должны были бы соответствовать равным элементам в собственном векторе, не были признаны имеющими равные значения.Проблема заключалась в том, что значения вычислялись с точностью до машины по некоторому алгоритму (возможно, Ланцошу, но я не совсем знаком с numpy).Это пример вывода, в котором я явно проверяю разницу между двумя записями в собственном векторе:
>>> T=spectral.seriation(A,index)
columns [ 0 1 2 3 4 5 6 7 8 9 10 11]
[ 3.30289130e-01 -2.75240941e-01 -2.75240941e-01 3.30289130e-01
-2.75240941e-01 3.30289130e-01 -2.75240941e-01 3.30289130e-01
3.30289130e-01 -2.75240941e-01 -1.69794463e-16 -2.75240941e-01]
[ 4 6 9 1 2 11 10 0 5 7 8 3]
difference -5.55111512313e-17
Подпрограмма seriation () является рекурсивной функцией.Массив чисел с плавающей запятой - это рассматриваемый собственный вектор, а массив ниже, который дает отсортированный порядок столбцов.Обратите внимание, что столбцы [4,6,9,1,2,11] имеют одинаковое значение.Тем не менее, вычисления собственного вектора и собственного значения всегда являются приблизительными, и, действительно, когда я вывожу разницу между записью в столбце 9 и столбце 2, она не равна нулю.Там, где алгоритм должен группировать [4,6,9,1,2,11], он группирует только [4,6,9] и помещает остальное в другую группу, бросая гаечный ключ в работы.
Таким образом, вопрос заключается в следующем: существует ли метод для выполнения вычислений произвольной точности в numpy?Если это не удастся, что будет «хорошим» решением этой проблемы?
Кроме того, я, вероятно, должен упомянуть, что математически доказано, что эти записи должны быть равны.Это свойство матрицы, но, надеюсь, это не относится к вопросу.