numpy.linalg.eig返回的特征向量是否正交?如何获取正交归一化特征向量?
关于numpy.linalg.eig返回的特征向量正交性问题
1. 特征向量是否正交?
这个得分情况讨论:
- 如果矩阵是正规矩阵(比如实对称矩阵、Hermitian矩阵、正交矩阵、酉矩阵等,满足$A A^H = A^H A$,实矩阵下就是$A A^T = A^T A$),
numpy.linalg.eig返回的特征向量是正交的(实矩阵下是实正交,复矩阵下是酉正交)。 - 如果矩阵是非正规矩阵(比如一般的非对称实矩阵),即使特征值互不相同,特征向量也只是线性无关,不一定正交;如果有重特征值,甚至可能不存在线性无关的特征向量(矩阵不可对角化)。
2. 点积结果约为0.0001,能否视为正交?
你遇到的这个情况要分场景判断:
- 如果你的矩阵是正规矩阵(比如实对称),理论上特征向量应该严格正交,计算出的微小偏差(比如1e-16量级)完全是浮点数精度限制导致的,完全可以视为正交。
- 如果点积结果是0.0001(1e-4)这个量级,建议检查两个问题:
- 是不是点积计算方式错了?在numpy里,应该用
np.dot(v0, v1)或者v0 @ v1(一维数组),如果是二维数组的列向量,要用v0.T @ v1,避免只做元素相乘没求和的情况。 - 是不是矩阵本身不是正规矩阵?如果是非正规矩阵,不同特征值的特征向量本身就不正交,这个结果就是真实的非正交性,而非误差。
- 是不是点积计算方式错了?在numpy里,应该用
3. 如何获取正交且归一化的特征向量及对应特征值?
首先要明确:只有正规矩阵才能拥有正交的特征向量组,非正规矩阵不存在这样的特征向量组(因为正交特征向量组对应的矩阵一定是正规矩阵)。针对不同情况:
情况1:矩阵是正规矩阵(比如实对称)
推荐使用numpy.linalg.eigh而非eig:
eigh专门针对Hermitian矩阵(实对称矩阵是特例),返回的特征向量是严格正交归一化的,而且数值稳定性比eig更好,计算精度更高。- 示例代码:
import numpy as np # 实对称矩阵示例 A = np.array([[1, 2], [2, 1]]) eigenvalues, eigenvectors = np.linalg.eigh(A) # 验证正交性:点积接近0 print(np.dot(eigenvectors[:,0], eigenvectors[:,1])) # 输出约为1e-16量级的极小值 # 验证归一化:模长为1 print(np.linalg.norm(eigenvectors[:,0])) # 输出1.0
情况2:矩阵是非正规矩阵
如果矩阵是非正规矩阵,不存在正交的特征向量组,若需要正交向量组,可以用Schur分解:
numpy.linalg.schur会返回正交矩阵Q和上三角矩阵T,满足$A = Q T Q^T$(实矩阵)。Q的列是正交归一化的,但这些列不是特征向量,只是Schur向量。- 示例代码:
import numpy as np # 非对称非正规矩阵示例 A = np.array([[1, 1], [0, 2]]) Q, T = np.linalg.schur(A) # 验证Q的列正交 print(np.dot(Q[:,0], Q[:,1])) # 输出约为0 # 验证Q的列归一化 print(np.linalg.norm(Q[:,0])) # 输出1.0
注意:Schur向量不是特征向量,只是正交向量组;如果必须要特征向量,非正规矩阵的特征向量无法做到正交,只能接受它们线性无关的性质。
内容的提问来源于stack exchange,提问作者kinder chen
相关产品推荐
相关产品推荐

