纽比.dot当手动输入矩阵时,相同矩阵的不同输出

2024-05-16 07:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道为什么美国运输部(U,SV)!= 美国运输部(A,B)当我相信A=U和B=SV时,即使我在使用SVD恢复矩阵U和SV时手动输入A和B的条目。下面的代码再现了这个奇怪的现象。在

import numpy
from numpy.linalg import svd
    In [121]: fullSet = np.array([[100,50,50],[50,100,100],[20,130,130],[50,100,100]])

In [122]: print fullSet
[[100  50  50]
 [ 50 100 100]
 [ 20 130 130]
 [ 50 100 100]]

In [123]: 

In [123]: U,s,V = svd(fullSet,full_matrices=True)

In [124]: print 'U'
U

In [125]: print U.round()
[[ 0.  1. -0. -0.]
 [ 1.  0.  1. -0.]
 [ 1. -0. -1. -0.]
 [ 1.  0.  0.  1.]]

In [126]: 

In [126]: S = np.zeros((U.shape[1],V.shape[0]))

In [127]: S[:s.shape[0],:s.shape[0]] = np.diag(s)

In [128]: print 'S'
S

In [129]: print S.round()
[[ 296.    0.    0.]
 [   0.   82.    0.]
 [   0.    0.    0.]
 [   0.    0.    0.]]

In [130]: 

In [130]: print 'V'
V

In [131]: print V.round()
[[ 0.  1.  1.]
 [ 1. -0. -0.]
 [-0.  1. -1.]]

In [132]: 

In [132]: print 'SV'
SV

In [133]: print np.dot(S,V).round()
[[  97.  198.  198.]
 [  78.  -19.  -19.]
 [   0.    0.   -0.]
 [   0.    0.    0.]]

In [134]: print 'SV'
SV

In [135]: print np.dot(S,V).round()
[[  97.  198.  198.]
 [  78.  -19.  -19.]
 [   0.    0.   -0.]
 [   0.    0.    0.]]

In [136]: print 'USV'
USV

In [137]: SV=np.dot(S,V)

In [138]: print np.dot(U,SV)
[[ 100.   50.   50.]
 [  50.  100.  100.]
 [  20.  130.  130.]
 [  50.  100.  100.]]

In [139]: 

In [139]: 

In [139]: A = np.array([[0,1,0,0],[1,0,-1,0],[1,0,1,0],[1,0,0,1]])

In [140]: B = np.array([[97,198,198],[78,-19,-19],[0,0,0],[0,0,0]])

In [141]: print "A"
A

In [142]: print A
[[ 0  1  0  0]
 [ 1  0 -1  0]
 [ 1  0  1  0]
 [ 1  0  0  1]]

In [143]: print "B"
B

In [144]: print B
[[ 97 198 198]
 [ 78 -19 -19]
 [  0   0   0]
 [  0   0   0]]

In [145]: print "AdotB"
AdotB

In [146]: print np.dot(A,B)
[[ 78 -19 -19]
 [ 97 198 198]
 [ 97 198 198]
 [ 97 198 198]]

In [147]: print np.allclose(A,U.round())
False

In [148]: print np.allclose(B,SV.round())
True

In [149]: print A[0,0]
0

In [150]: print U[0,0]
0.33656051104

Tags: inimportnumpytruenparraydotsvd
1条回答
网友
1楼 · 发布于 2024-05-16 07:56:07

重新创建您的USV

In [627]: U
Out[627]: 
array([[ -3.36560511e-01,   8.66235179e-01,  -3.69274473e-01,
         -4.61618492e-16],
       [ -5.07358551e-01,   1.27694290e-02,   4.92365964e-01,
         -7.07106781e-01],
       [ -6.09837375e-01,  -4.99310021e-01,  -6.15457455e-01,
         -1.06278764e-15],
       [ -5.07358551e-01,   1.27694290e-02,   4.92365964e-01,
          7.07106781e-01]])
In [628]: SV
Out[628]: 
array([[ -9.65886537e+01,  -1.97578594e+02,  -1.97578594e+02],
       [  7.79142604e+01,  -1.90446580e+01,  -1.90446580e+01],
       [  0.00000000e+00,   4.63542263e-15,  -4.63542263e-15],
       [  0.00000000e+00,   0.00000000e+00,   0.00000000e+00]])
In [629]: np.dot(U,SV)
Out[629]: 
array([[ 100.,   50.,   50.],
       [  50.,  100.,  100.],
       [  20.,  130.,  130.],
       [  50.,  100.,  100.]])

具有舍入值的dot不会产生相同的结果:

^{pr2}$

USV的完整浮点值有显著差异。记住dot是乘积的和,这些是

相关问题 更多 >