numpy.linalg.eig 创建的特征向量似乎不正确
eigenvectors created by numpy.linalg.eig don't seem correct
我创建了一个任意的 2x2 矩阵:
In [87]: mymat = np.matrix([[2,4],[5,3]])
In [88]: mymat
Out[88]:
matrix([[2, 4],
[5, 3]])
我尝试使用 numpy.linalg.eig:
计算特征向量
In [91]: np.linalg.eig(mymat)
Out[91]:
(array([-2., 7.]),
matrix([[-0.70710678, -0.62469505],
[ 0.70710678, -0.78086881]]))
In [92]: eigvec = np.linalg.eig(mymat)[1][0].T
In [93]: eigvec
Out[93]:
matrix([[-0.70710678],
[-0.62469505]])
我将我的一个特征向量与我的矩阵相乘,期望结果是一个向量,它是我的特征向量的标量倍数。
In [94]: mymat * eigvec
Out[94]:
matrix([[-3.91299375],
[-5.40961905]])
然而事实并非如此。任何人都可以向我解释这里出了什么问题吗?
来自 linalg.eig
的文档:
v : (..., M, M) array
The normalized (unit "length") eigenvectors, such that the
column v[:,i]
is the eigenvector corresponding to the
eigenvalue w[i]
.
您需要列,而不是行。
>>> mymat = np.matrix([[2,4],[5,3]])
>>> vals, vecs = np.linalg.eig(mymat)
>>> vecs[:,0]
matrix([[-0.70710678],
[ 0.70710678]])
>>> (mymat * vecs[:,0])/vecs[:,0]
matrix([[-2.],
[-2.]])
>>> vecs[:,1]
matrix([[-0.62469505],
[-0.78086881]])
>>> (mymat * vecs[:,1])/vecs[:,1]
matrix([[ 7.],
[ 7.]])
不,这是真的。 numpy 无法正常工作。示例:
A
Out[194]:
matrix([[-3, 3, 2],
[ 1, -1, -2],
[-1, -3, 0]])
E = np.linalg.eig(A)
E
Out[196]:
(array([ 2., -4., -2.]),
matrix([[ -2.01889132e-16, 9.48683298e-01, 8.94427191e-01],
[ 5.54700196e-01, -3.16227766e-01, -3.71551690e-16],
[ -8.32050294e-01, 2.73252305e-17, 4.47213595e-01]]))
A*E[1] / E[1]
Out[205]:
matrix([[ 6.59900617, -4. , -2. ],
[ 2. , -4. , -3.88449298],
[ 2. , 8.125992 , -2. ]])
我创建了一个任意的 2x2 矩阵:
In [87]: mymat = np.matrix([[2,4],[5,3]])
In [88]: mymat
Out[88]:
matrix([[2, 4],
[5, 3]])
我尝试使用 numpy.linalg.eig:
计算特征向量In [91]: np.linalg.eig(mymat)
Out[91]:
(array([-2., 7.]),
matrix([[-0.70710678, -0.62469505],
[ 0.70710678, -0.78086881]]))
In [92]: eigvec = np.linalg.eig(mymat)[1][0].T
In [93]: eigvec
Out[93]:
matrix([[-0.70710678],
[-0.62469505]])
我将我的一个特征向量与我的矩阵相乘,期望结果是一个向量,它是我的特征向量的标量倍数。
In [94]: mymat * eigvec
Out[94]:
matrix([[-3.91299375],
[-5.40961905]])
然而事实并非如此。任何人都可以向我解释这里出了什么问题吗?
来自 linalg.eig
的文档:
v : (..., M, M) array
The normalized (unit "length") eigenvectors, such that the columnv[:,i]
is the eigenvector corresponding to the eigenvaluew[i]
.
您需要列,而不是行。
>>> mymat = np.matrix([[2,4],[5,3]])
>>> vals, vecs = np.linalg.eig(mymat)
>>> vecs[:,0]
matrix([[-0.70710678],
[ 0.70710678]])
>>> (mymat * vecs[:,0])/vecs[:,0]
matrix([[-2.],
[-2.]])
>>> vecs[:,1]
matrix([[-0.62469505],
[-0.78086881]])
>>> (mymat * vecs[:,1])/vecs[:,1]
matrix([[ 7.],
[ 7.]])
不,这是真的。 numpy 无法正常工作。示例:
A
Out[194]:
matrix([[-3, 3, 2],
[ 1, -1, -2],
[-1, -3, 0]])
E = np.linalg.eig(A)
E
Out[196]:
(array([ 2., -4., -2.]),
matrix([[ -2.01889132e-16, 9.48683298e-01, 8.94427191e-01],
[ 5.54700196e-01, -3.16227766e-01, -3.71551690e-16],
[ -8.32050294e-01, 2.73252305e-17, 4.47213595e-01]]))
A*E[1] / E[1]
Out[205]:
matrix([[ 6.59900617, -4. , -2. ],
[ 2. , -4. , -3.88449298],
[ 2. , 8.125992 , -2. ]])