python - 当我尝试对角化对称矩阵时,为什么 `np.linalg.eig` 不返回酉矩阵?

标签 python numpy matrix linear-algebra eigenvector

我使用 Python 创建了一个对称矩阵 X,并使用代码 Lambda, U = np.linalg.eig(X) 将其对角化。我的理解是:由于 X 是对称的,U 应该是单一的,但我发现情况并非如此,因为 U 具有特征值没有绝对值 1,这也意味着这也不是缩放问题。我的问题是为什么 U 不是单一的?


这是一个最小的可重现示例,用于查看我得到的结果:

import numpy as np

#Symmetric matrix, which should be diagonalized by unitary
X = np.array([[-1.1918157 ,  0.        ,  0.        ,  0.        ,  0.09852097,
         0.        ,  0.        ,  0.        ],
       [ 0.        , -1.1918157 ,  0.        ,  0.        ,  0.        ,
         0.09852097,  0.        ,  0.        ],
       [ 0.        ,  0.        , -1.08529969,  0.        ,  0.        ,
         0.        ,  0.07826825,  0.        ],
       [ 0.        ,  0.        ,  0.        , -1.08529969,  0.        ,
         0.        ,  0.        ,  0.07826825],
       [ 0.09852097,  0.        ,  0.        ,  0.        , -1.00585682,
         0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.09852097,  0.        ,  0.        ,  0.        ,
        -1.00585682,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.07826825,  0.        ,  0.        ,
         0.        , -0.98276093,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.07826825,  0.        ,
         0.        ,  0.        , -0.98276093]])

#check if X is symmetric
assert np.linalg.norm(X - X.conj().T) == 0

#diagonalize X
Lambda, U = np.linalg.eig(X)

#check if U is unitary
print(
    np.allclose(U @ U.conj().T, np.identity(U.shape[0])),
    np.allclose(U.conj().T,     np.linalg.inv(U))
)

#Since the above returns false, how non-unitary is it?
print(
    np.linalg.norm(U @ U.conj().T - np.identity(U.shape[0])),
    np.linalg.norm(U.conj().T - np.linalg.inv(U))
)

以上代码的输出为:

False False
0.994793051566498 1.1641788210519939

最佳答案

永远不能保证返回酉矩阵。

#diagonalize X
Lambda, U = np.linalg.eig(X)

从这行代码中,您可以找到 X 的特征值(存储在 Lambda 中)及其右特征向量(存储在矩阵 U)。参见 the doc .

这里唯一单一的东西是特征向量,它们是 U

In [4]: np.linalg.norm(U, axis=0)
Out[4]: array([1., 1., 1., 1., 1., 1., 1., 1.])

阅读有关特征值和特征向量的更多信息:wiki , wolfram

关于python - 当我尝试对角化对称矩阵时,为什么 `np.linalg.eig` 不返回酉矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72552940/

相关文章:

python - 从列表中删除正则表达式元素

list - 将 Numpy ndarray 转换为列表

r - 如何rbind两个具有不同列数的矩阵?

python - R:将表转换为邻接矩阵或边列表

python - Python 拼写检查器

python - 使用 python 的 SQL 更新命令不起作用

python - 在 Python 中从 TCP 客户端获取字符串后加快从字节字符串到图像的转换

arrays - 在 Python 中乘以矩阵数组的最快方法(numpy)

python - 如何将Heruko与本地计算机的Docker API(Python SDK)结合使用?

python - 我怎样才能让计算机读取python文件而不是py?