2012-05-21 5 views
3

Я использую numpy.svd для вычисления разностных разложений сильно обусловленных матриц. Для некоторых особых случаев svd не будет сходиться и поднять Linalg.Error. Я провел некоторое исследование и обнаружил, что numpy использует процедуру DGESDD из LAPACK. Стандартная реализация имеет жесткий итерационный предел в 35 или что-то итерации. Если я попытаюсь разложить одну и ту же матрицу в Matlab, все будет хорошо, и я думаю, что для этого есть две причины: 1. Matlab использует DGESVD вместо DGESDD, который в целом кажется более надежным. 2. Matlab использует ограничение итерации 75 в рутине. (Они изменили его в источнике и перекомпилировали его.)Использование альтернативного драйвера LAPACK в svd-методе numpy?

Теперь возникает вопрос: существует ли простой способ изменить используемый бэкэнд в numpy от DGESDD до DGESVD без необходимости изменения источника numpy?

Заранее спасибо Мишей

+0

Это весьма маловероятно, но вы могли бы напишите свой собственный модуль f2py, вызывающий DGESVD. –

+0

Я надеялся избежать этого, но, похоже, мне все равно придется это делать ... –

ответ

0

Я немного опоздал, но, возможно, это поможет кому-то еще ...

У меня была аналогичная проблема в julia.

я нашел this approach from the R help list, который должен работать в любой среде с использованием библиотеки Lapack:

В принципе, если SVD (М) терпит неудачу, попытайтесь СВД (M '), и поменять полученный U, V соответственно.

Вот как я это делаю в Джулии:

try 
    U,S,V = svd(E_restricted) 
    failed = false 
catch 
    failed = true 
end 
if failed 
    # try it with matrix transposed 
    try 
    V,S,U = svd(E_restricted') 
    failed = false 
    catch 
    failed = true 
    end 
end 
if failed 
    error("ERROR: svd(E) and svd(E') failed!") 
end 
+0

Не решает проблему, используя Numpy 1.8. – theV0ID

1

То, что сработало для меня было только вычислить "economy size" SVD этой матрицы X:

U,S,V = np.linalg.svd(X, full_matrices=False)