Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using alternative LAPACK driver in numpy's svd method?

I'm using numpy.svd to compute singular value decompositions of badly conditioned matrices. For some special cases the svd won't converge and raise a Linalg.Error. I've done some research and found that numpy uses the DGESDD routine from LAPACK. The standard implementation has a hardcoded iteration limit of 35 or something iterations. If I try to decompose the same matrix in Matlab, everything works fine, and I think there's two reasons for that: 1. Matlab uses DGESVD instead of DGESDD which in general seems to be more robust. 2. Matlab uses an iteration limit of 75 in the routine. (They changed it in the source and recompiled it.)

Now the question is: Is there a simple way to change the used backend in numpy from DGESDD to DGESVD without having to modify the numpy source ?

Thanks in advance Mischa

like image 755
Mischa Obrecht Avatar asked Nov 13 '22 05:11

Mischa Obrecht


1 Answers

What worked for me was to only compute the "economy size" SVD of that matrix X:

U,S,V = np.linalg.svd(X, full_matrices=False)
like image 164
theV0ID Avatar answered Jan 04 '23 15:01

theV0ID