Быстрый способ восстановления ведущих сингулярных векторов

Существует ли для данной матрицы быстрый алгоритм восстановления ведущих сингулярных векторов, т. е. найти ближайшую матрицу ранга 1, ближайшую к матрице в норме Фробениуса?

Под быстрым алгоритмом я подразумеваю все, что быстрее, чем:

  [U, S, V] = svd(A);
  A1 = U(:,1)*S(1,1)*V(:,1)';

person Uri Cohen    schedule 16.06.2019    source источник
comment
Ведущий сингулярный вектор можно получить, вычислив A^large_power (и взяв норму).   -  person Willem Van Onsem    schedule 16.06.2019
comment
Этот вопрос гораздо больше подходит для Computational Science SE. Короче говоря, я думаю, что вы смотрите на библиотеку типа ARPACK.   -  person Anton Menshov    schedule 17.06.2019


Ответы (1)


Таким образом, для этой цели можно использовать мощный метод:

C = A*A';
v1 = power_method(C);
v2 = nanmean(A./v1,1)';
A1 = v1*v2';

но в моих экспериментах это не всегда быстрее, чем высокооптимизированный полный svd:

[U,S,V] = svd(A); 
A1 = U(:,1)*S(1,1)*V(:,1)';

но я предполагаю, что для больших матриц это может работать лучше.

person Uri Cohen    schedule 17.06.2019