由 Python 计算的矩阵的特征向量似乎不是特征向量
Eigenvector of matrix computed by Python does not appear to be an eigenvector
提前致歉,Python不是我的强项。
与该矩阵的实特征值对应的特征向量(由 Python 计算)似乎不是特征向量,而由 Wolfram Alpha 计算的特征向量似乎有效。 (我的同事证实,在 R 中执行计算时似乎出现了相同的病理情况,尽管我没有成绩单。)代码片段:
>>> import numpy as np
>>> in_matrix = np.array([[0.904, 0.012, 0.427], [-0.0032, 0.99975, -0.02207], [-0.4271, 0.0186, 0.904]])
>>> evals, evecs = np.linalg.eig(in_matrix)
>>> print evals
[ 0.90388357+0.42760138j 0.90388357-0.42760138j 0.99998285+0.j]
>>> print evecs[2]
[ 0.70696571+0.j 0.70696571-0.j 0.01741090+0.j]
>>> print in_matrix.dot(evecs[2])
[ 0.65501505+0.j 0.70414242+0.j -0.27305604+0.j]
请注意,将 evecs[2]
乘以 in_matrix
变量会产生一个新向量,该向量不是 evecs[2]
(特征向量应为 1)。
将相同的矩阵代入 Wolfram Alpha 生成实特征值的特征向量 (-0.0474067, -0.998724, 0.0174109)
。正如预期的那样,将 in_matrix
乘以这个特征向量确实会产生相同的向量。
>>> wolfram_vec = np.array([-0.0474067, -0.998724, 0.0174109])
>>> print in_matrix.dot(wolfram_vec)
[-0.04740589 -0.99870688 0.01741059]
Wolfram(正确)特征向量对应负 Y 轴,而 numpy 给出 (sqrt(2), sqrt(2), 0)
.
底线:来自 numpy 的特征向量不是特征向量,但 Wolfram Alpha 特征向量是正确的(并且看起来是)。任何人都可以对此有所了解吗?
这已经在 Mac OS X 上的标准安装 Python 2.7.10 和 Centos 上的自定义安装 Python 2.7.8 上进行了测试6.8.
引用文档:
v : (..., M, M) array
The normalized (unit "length") eigenvectors, such that the
column ``v[:,i]`` is the eigenvector corresponding to the
eigenvalue ``w[i]``.
您需要提取列 evecs[:, i]
,而不是行 evecs[i]
。
In [30]: evecs[:, 2]
Out[30]: array([-0.04740673+0.j, -0.99872392+0.j, 0.01741090+0.j])
您可能认为它与 Wolfram 向量相同。所有三个特征向量都是正确的:
In [31]: in_matrix.dot(evecs[:, 0]) - evals[0] * evecs[:, 0]
Out[31]:
array([ 5.55111512e-17 +1.11022302e-16j,
-7.11236625e-17 +1.38777878e-17j, 2.22044605e-16 -1.66533454e-16j])
In [32]: in_matrix.dot(evecs[:, 1]) - evals[1] * evecs[:, 1]
Out[32]:
array([ 5.55111512e-17 -1.11022302e-16j,
-7.11236625e-17 -1.38777878e-17j, 2.22044605e-16 +1.66533454e-16j])
In [33]: in_matrix.dot(evecs[:, 2]) - evals[2] * evecs[:, 2]
Out[33]: array([ 3.46944695e-17+0.j, 4.44089210e-16+0.j, 3.15719673e-16+0.j])
其中每个结果都是 [0, 0, 0],在预期的精度范围内。
提前致歉,Python不是我的强项。
与该矩阵的实特征值对应的特征向量(由 Python 计算)似乎不是特征向量,而由 Wolfram Alpha 计算的特征向量似乎有效。 (我的同事证实,在 R 中执行计算时似乎出现了相同的病理情况,尽管我没有成绩单。)代码片段:
>>> import numpy as np
>>> in_matrix = np.array([[0.904, 0.012, 0.427], [-0.0032, 0.99975, -0.02207], [-0.4271, 0.0186, 0.904]])
>>> evals, evecs = np.linalg.eig(in_matrix)
>>> print evals
[ 0.90388357+0.42760138j 0.90388357-0.42760138j 0.99998285+0.j]
>>> print evecs[2]
[ 0.70696571+0.j 0.70696571-0.j 0.01741090+0.j]
>>> print in_matrix.dot(evecs[2])
[ 0.65501505+0.j 0.70414242+0.j -0.27305604+0.j]
请注意,将 evecs[2]
乘以 in_matrix
变量会产生一个新向量,该向量不是 evecs[2]
(特征向量应为 1)。
将相同的矩阵代入 Wolfram Alpha 生成实特征值的特征向量 (-0.0474067, -0.998724, 0.0174109)
。正如预期的那样,将 in_matrix
乘以这个特征向量确实会产生相同的向量。
>>> wolfram_vec = np.array([-0.0474067, -0.998724, 0.0174109])
>>> print in_matrix.dot(wolfram_vec)
[-0.04740589 -0.99870688 0.01741059]
Wolfram(正确)特征向量对应负 Y 轴,而 numpy 给出 (sqrt(2), sqrt(2), 0)
.
底线:来自 numpy 的特征向量不是特征向量,但 Wolfram Alpha 特征向量是正确的(并且看起来是)。任何人都可以对此有所了解吗?
这已经在 Mac OS X 上的标准安装 Python 2.7.10 和 Centos 上的自定义安装 Python 2.7.8 上进行了测试6.8.
引用文档:
v : (..., M, M) array
The normalized (unit "length") eigenvectors, such that the
column ``v[:,i]`` is the eigenvector corresponding to the
eigenvalue ``w[i]``.
您需要提取列 evecs[:, i]
,而不是行 evecs[i]
。
In [30]: evecs[:, 2]
Out[30]: array([-0.04740673+0.j, -0.99872392+0.j, 0.01741090+0.j])
您可能认为它与 Wolfram 向量相同。所有三个特征向量都是正确的:
In [31]: in_matrix.dot(evecs[:, 0]) - evals[0] * evecs[:, 0]
Out[31]:
array([ 5.55111512e-17 +1.11022302e-16j,
-7.11236625e-17 +1.38777878e-17j, 2.22044605e-16 -1.66533454e-16j])
In [32]: in_matrix.dot(evecs[:, 1]) - evals[1] * evecs[:, 1]
Out[32]:
array([ 5.55111512e-17 -1.11022302e-16j,
-7.11236625e-17 -1.38777878e-17j, 2.22044605e-16 +1.66533454e-16j])
In [33]: in_matrix.dot(evecs[:, 2]) - evals[2] * evecs[:, 2]
Out[33]: array([ 3.46944695e-17+0.j, 4.44089210e-16+0.j, 3.15719673e-16+0.j])
其中每个结果都是 [0, 0, 0],在预期的精度范围内。