python - 特征向量歧义 - 如何强制执行特定的符号约定
问题描述
我正在用 Python 编写一个程序,用于numpy.linalg.eigh
对 Hermitian 矩阵(哈密顿矩阵)进行对角化。我对许多这样的矩阵进行对角化,并将得到的特征向量矩阵用于其他矩阵的多个酉变换。“特征向量矩阵”是指一个矩阵,其列是原始矩阵的特征向量。
不幸的是,由于特征向量符号不明确,我遇到了一个潜在的问题(即,特征向量仅被定义为一个常数,而归一化仍然不能修复特征向量的符号)。具体来说,我计算的结果取决于连续的单一变换产生的干涉图案。因此,我预计符号歧义将成为一个问题。
我的问题:
为特征向量强制执行特定符号约定的最佳方式(或行业标准)是什么?
我想到/遇到以下情况:
- 确保每个特征向量的第一个系数为正。问题:其中一些系数为零或数值误差为零。
- 确保第一个最大幅度系数为正。问题:一些特征向量在数值误差内具有多个具有相同幅度的系数。然后数值误差“随机”确定哪个系数“更大”。
- 确保系数之和为正。问题:一些系数在大小上相等但符号相反,使符号仍然模棱两可/由数值误差确定。(我还看到这种方法的其他问题)。
- 给特征向量加上一个小数(比如1E-16),保证第一个系数为正,然后减去这个数。问题:也许对我来说并不重要,但这让我感到不安,因为我不确定它可能会导致什么问题。
- (受SVD 和 PCA 中的Eigenshuffle和Sign 校正的启发)选择一个参考向量并确保每个特征向量与该向量的点积为正。问题:如何选择向量?随机向量增加了没有特征向量与其正交的可能性(在数值误差范围内),但不能保证。或者,可以选择一组随机向量(全部具有正系数)以增加向量空间足够“跨越”的可能性。
我试图找到什么是“标准”约定,但我很难找到任何特别有用的东西,尤其是在 Python 中。SVD 有一个解决方案(SVD 和 PCA 中的符号校正),但我没有任何数据向量可以比较。有Eigenshuffle(用于 Matlab,我正在使用 Python),但我的矩阵通常不是彼此连续的小修改(尽管有些是)。
我倾向于解决方案 5,因为它看起来很直观;我们只是确保所有特征向量都在同一个高维“象限”中。此外,假设系统的维数不太大(我的系统的维数为 9),具有两个或三个具有正系数的随机参考向量应该以非常高的概率覆盖几乎所有特征向量。
解决方案
推荐阅读
- php - 从 facebook API 获取所有潜在客户广告
- c - 运算符关联性,优先级
- java - 如何使我的 if 条件在 Java 的线程中工作?
- html - 如何更改平板电脑布局上的 Bootstrap 3 列布局?
- python-3.x - 如何在 pywebview/eel 中从一个窗口启动操作并在另一个窗口执行操作?
- powershell - Powershell Active Directory 用户名
- amazon-web-services - Terraform:如何使用键值输出
- python-3.x - 如何在我的熊猫数据框中填充前一天的非空值
- c# - c# 无法从简单数组中设置变量
- python - 如何在 python SQLAlchemy 中按子字符串排序