numpy 特征分解产生意想不到的输出?
numpy eigen decomposition produce unexpected output?
根据 numpy.linalg.eig
的文档和我对特征分解的理解,以下代码:
a = [[1,1],[-1,-1]]
w, v = np.linalg.eig(a)
c = a@v
print(c)
print(w)
应该产生:
[[√2,0],[-√2,0]]
[4,0]
但它却产生了:
[[ 1.11022302e-16+1.11022302e-16j 1.11022302e-16-1.11022302e-16j]
[-1.11022302e-16-1.11022302e-16j -1.11022302e-16+1.11022302e-16j]]
[-3.25176795e-17+1.57009246e-16j -3.25176795e-17-1.57009246e-16j]
所以我哪里错了?
有矩阵a
a = np.array([[ 1, 1],\
[-1, -1]])
你的两个特征值理论上应该是w_th=[0,0]
,所以:
w
>>> array([-3.25176795e-17+1.57009246e-16j, -3.25176795e-17-1.57009246e-16j])
只是复数形式的一些零 +/- 舍入误差。关于特征向量,这些是 v_th=[[1,1],[-1,-1]]
但 numpy.linalg.eig 将它们归一化为单一长度( 例如 第一个 np.linalg.norm(v[:,0],2) = 0.99...
),这意味着它只是给了你 [[1/sqrt(2),1/sqrt(2)],[-1/sqrt(2),-1/sqrt(2)]]
的近似值:
v
>>> array([[ 0.70710678+0.00000000e+00j, 0.70710678-0.00000000e+00j],
[-0.70710678+1.11022302e-16j, -0.70710678-1.11022302e-16j]])
了解以上所有内容,您现在可以通过比较等式两边来进行数值验证 :
np.allclose(a@v,w*v)
>>> True
或理论值,即 "without"舍入误差:
a@np.asarray(v_th)
>>> array([[0, 0],
[0, 0]])
np.asarray(w_th)*np.asarray(v_th)
>>> array([[0, 0],
[0, 0]])
所以这里的 numpy 输出没有什么意外,似乎只是你的分析特征值 [4,0]
是假的。
根据 numpy.linalg.eig
的文档和我对特征分解的理解,以下代码:
a = [[1,1],[-1,-1]]
w, v = np.linalg.eig(a)
c = a@v
print(c)
print(w)
应该产生:
[[√2,0],[-√2,0]]
[4,0]
但它却产生了:
[[ 1.11022302e-16+1.11022302e-16j 1.11022302e-16-1.11022302e-16j]
[-1.11022302e-16-1.11022302e-16j -1.11022302e-16+1.11022302e-16j]]
[-3.25176795e-17+1.57009246e-16j -3.25176795e-17-1.57009246e-16j]
所以我哪里错了?
有矩阵a
a = np.array([[ 1, 1],\
[-1, -1]])
你的两个特征值理论上应该是w_th=[0,0]
,所以:
w
>>> array([-3.25176795e-17+1.57009246e-16j, -3.25176795e-17-1.57009246e-16j])
只是复数形式的一些零 +/- 舍入误差。关于特征向量,这些是 v_th=[[1,1],[-1,-1]]
但 numpy.linalg.eig 将它们归一化为单一长度( 例如 第一个 np.linalg.norm(v[:,0],2) = 0.99...
),这意味着它只是给了你 [[1/sqrt(2),1/sqrt(2)],[-1/sqrt(2),-1/sqrt(2)]]
的近似值:
v
>>> array([[ 0.70710678+0.00000000e+00j, 0.70710678-0.00000000e+00j],
[-0.70710678+1.11022302e-16j, -0.70710678-1.11022302e-16j]])
了解以上所有内容,您现在可以通过比较等式两边来进行数值验证
np.allclose(a@v,w*v)
>>> True
或理论值,即 "without"舍入误差:
a@np.asarray(v_th)
>>> array([[0, 0],
[0, 0]])
np.asarray(w_th)*np.asarray(v_th)
>>> array([[0, 0],
[0, 0]])
所以这里的 numpy 输出没有什么意外,似乎只是你的分析特征值 [4,0]
是假的。