Мне интересно, почему np.dot (U, SV)! = Np.dot (A, B), когда я верю A = U и B = SV, даже хотя я вручную указываю записи A и B при использовании SVD для восстановления матриц U и SV. В приведенном ниже коде воспроизводится странность.numpy.dot другой вывод для тех же матриц, когда матрицы введены вручную.
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
В чем причина округления вывода? 'A' и' U' и 'B' и' SV' не являются одинаковыми матрицами. Кажется очевидным, что операция над закругленными матрицами дает другой результат, чем та же операция над некруглыми матрицами, если только 'U' и' SV' не являются целыми матрицами ... – Forzaa