2016-06-05 7 views
1

Я должен сделать SVD матрицы, но он имеет некоторые ошибки, в следующем примере U[1][1], U[2][1] и U[2][0] должен быть 0.Уменьшение ошибки округления в SVD матрицы

enter image description here

Дело в том, что в приведенном выше примере был только тест, я должен работать с большими матрицами, которые не будут так хорошо условными, что я могу сделать, чтобы доверять результаты, которые я получу?

ответ

2

По большинству стандартов 1e-17 считается 0.

Например, он проходит испытание np.allclose

In [582]: A=np.array([1,-1,1,1,1,1]).reshape(3,2) 

In [583]: U,d,V=np.linalg.svd(A) 

In [584]: U 
Out[584]: 
array([[ -8.56248666e-17, 1.00000000e+00, -6.40884929e-17], 
     [ -7.07106781e-01, 2.53974359e-17, -7.07106781e-01], 
     [ -7.07106781e-01, 2.53974359e-17, 7.07106781e-01]]) 

In [585]: y=np.array([[0,np.sqrt(2),0],[-1,0,-1],[-1,0,1]])/np.sqrt(2) 

In [586]: y 
Out[586]: 
array([[ 0.  , 1.  , 0.  ], 
     [-0.70710678, 0.  , -0.70710678], 
     [-0.70710678, 0.  , 0.70710678]]) 

In [587]: np.allclose(U,y) 
Out[587]: True