Неопределенность собственного вектора - как обеспечить соблюдение соглашения о знаке - PullRequest
0 голосов
/ 24 октября 2018

Я пишу программу на Python, которая использует numpy.linalg.eigh для диагонализации эрмитовой матрицы (гамильтониан).Я диагонализирую множество таких матриц и использую полученные матрицы собственных векторов для нескольких унитарных преобразований некоторой другой матрицы.Под «матрицей собственных векторов» я подразумеваю матрицу, столбцы которой являются собственными векторами исходной матрицы.

К сожалению, я сталкиваюсь с потенциальной проблемой из-за неоднозначности знака собственных векторов (т. Е. Собственные векторы определяются только с точностью доконстанта и нормализация все еще не фиксируют знак собственного вектора).В частности, результат, который я вычисляю, зависит от интерференционных картин, создаваемых последовательными унитарными преобразованиями.Таким образом, я ожидаю, что двусмысленность знака станет проблемой.

Мой вопрос:

Каков наилучший способ (или отраслевой стандарт) для обеспечения соблюдения конкретного соглашения о знаках для собственных векторов?

Я подумал / натолкнулся наследующее:

  1. Убедитесь, что первый коэффициент каждого собственного вектора положительный.Проблема: некоторые из этих коэффициентов равны нулю или находятся в пределах числовой ошибки нуля.
  2. Убедитесь, что первый коэффициент наибольшей величины положительный.Проблема: некоторые из собственных векторов имеют несколько коэффициентов с одинаковой величиной в пределах числовой ошибки.Числовая ошибка, тогда «случайно» определяет, какой коэффициент «больше».
  3. Убедитесь, что сумма коэффициентов положительна.Проблема: некоторые коэффициенты равны по величине, но противоположны по знаку, оставляя знак по-прежнему неоднозначным / определяется численной ошибкой.(Я также вижу другие проблемы с этим подходом).
  4. Добавьте небольшое число (например, 1E-16) к собственному вектору, убедитесь, что первый коэффициент положительный, затем вычтите число.Проблема: Возможно, это не важно для меня, но меня это беспокоит, так как я не уверен, какие проблемы это может вызвать.
  5. (Вдохновлено Eigenshuffle и Исправление знака в SVD и PCA) Выберите опорный вектор и убедитесь, что скалярное произведение каждого собственного вектора с этим вектором положительное.Проблема: как выбрать вектор?Случайный вектор увеличивает вероятность того, что никакие собственные векторы не ортогональны ему (в пределах числовой ошибки), но нет никакой гарантии.В качестве альтернативы, можно выбрать набор случайных векторов (все с положительными коэффициентами), чтобы увеличить вероятность того, что векторное пространство достаточно хорошо «перекрыто».

Я пытался найти, что такое "стандартное соглашение, но мне трудно найти что-то особенно полезное, особенно в Python.Существует решение для SVD ( Коррекция знаков в SVD и PCA ), но у меня нет векторов данных для сравнения.Существует Eigenshuffle (это для Matlab, и я использую Python), но мои матрицы обычно не являются последовательными небольшими модификациями друг друга (хотя некоторые из них).

Я склоняюсь к решению5 на это кажется довольно интуитивным;мы просто гарантируем, что все собственные векторы находятся в одном и том же многомерном «квадранте».Кроме того, наличие двух или трех случайных опорных векторов с положительными коэффициентами должно охватывать почти все собственные векторы с очень высокой вероятностью, предполагая, что размерность системы не слишком велика (моя система имеет размерность 9).

...