特征向量模糊性 - 如何强制执行特定的符号约定

2nd*_*zed 6 python matrix eigenvector

我正在用 Python 编写一个程序,用于numpy.linalg.eigh对埃尔米特矩阵(哈密顿矩阵)进行对角化。我对许多这样的矩阵进行对角化,并使用所得的特征向量矩阵对其他矩阵进行多重酉变换。“特征向量矩阵”是指其列是原始矩阵的特征向量的矩阵。

不幸的是,由于特征向量符号模糊,我遇到了一个潜在的问题(即特征向量仅定义为常数,并且归一化仍然不能修复特征向量的符号)。具体来说,我计算的结果取决于连续酉变换产生的干涉图案。因此,我预计符号歧义将成为一个问题。

我的问题:

强制执行特征向量特定符号约定的最佳方法(或行业标准)是什么?

我想到/遇到以下内容:

  1. 确保每个特征向量的第一个系数为正。问题:其中一些系数为零或数值误差为零。
  2. 确保最大幅度的第一个系数为正。问题:某些特征向量在数值误差范围内具有多个相同大小的系数。然后,数值误差“随机”确定哪个系数“更大”。
  3. 确保系数之和为正。问题:一些系数大小相等但符号相反,导致符号仍然不明确/由数值误差确定。(我还发现这种方法存在其他问题)。
  4. 向特征向量添加一个小数(例如1E-16),确保第一个系数为正,然后减去该数。问题:也许对我来说不重要,但这让我感到不安,因为我不确定它可能会导致什么问题。
  5. (受到SVD 和 PCA 中的特征洗牌和符号校正的启发)选择一个参考向量并确保每个特征向量与该向量的点积为正。问题:如何选取向量?随机向量增加了没有特征向量与其正交的可能性(在数值误差范围内),但不能保证。或者,可以选择一组随机向量(全部具有正系数)来增加向量空间足够“跨越”的可能性。

我试图找到什么是“标准”约定,但我很难找到任何特别有用的东西,特别是在 Python 中。有一个 SVD 的解决方案(SVD 和 PCA 中的符号校正),但我没有任何数据向量可以比较。有Eigenshuffle(这是用于 Matlab 的,我使用的是 Python),但我的矩阵通常不是彼此连续的小修改(尽管有些是)。

我倾向于解决方案 5,因为它看起来非常直观;我们只是确保所有特征向量位于同一高维“象限”中。此外,假设系统的维数不太大(我的系统的维数为 9),拥有两个或三个具有正系数的随机参考向量应该以非常高的概率覆盖几乎所有特征向量。