svdsketch

Вычисление SVD низкорангового матричного эскиза

Описание

пример

[U,S,V] = svdsketch(A) возвращает сингулярное разложение (SVD) матричного эскиза низкого ранга входа матрицы A. Матричный эскиз является низкоранговым приближением, которое отражает только наиболее важные функции A (до допуска), что позволяет быстрее вычислять частичный SVD больших матриц по сравнению с использованием svds.

пример

[U,S,V] = svdsketch(A,tol) задает допуск для матричного эскиза. svdsketch использует tol для адаптивного определения ранга матричного приближения эскиза. Когда допуск становится больше, меньше функций A используются в матричном эскизе.

пример

[U,S,V] = svdsketch(A,tol,Name,Value) задает дополнительные опции с одним или несколькими Name,Value аргументы в виде пар. Для примера можно задать 'MaxIterations' и скаляром, чтобы настроить количество итераций, используемых для формирования матричного эскиза.

пример

[U,S,V,apxErr] = svdsketch(___) дополнительно возвращает вектор apxErr который содержит относительную ошибку приближения в каждой итерации, norm(U*S*V'-A,'fro')/norm(A,'fro'). Конечная запись в векторе apxErr(end) - относительное приближение ошибка выхода, возвращенная svdsketch.

Примеры

свернуть все

Использование svdsketch вычислить SVD-коэффициенты низкоуровневого матричного приближения.

Использование gallery для создания случайной матрицы 200 на 200 с геометрически распределенными сингулярными значениями.

A = gallery('randsvd',200);

Использование svdsketch вычислить SVD низкорангового приближения A.

[U,S,V] = svdsketch(A);

Проверьте размер выходов.

size(S)
ans = 1×2

   120   120

Результаты показывают, что низкоранговое матричное приближение A имеет ранг 120.

Задайте допуск с svdsketch вычислить SVD-коэффициенты низкоуровневого матричного приближения. svdsketch адаптивно определяет соответствующий ранг матричного эскиза на основе заданного допуска.

Использование gallery для создания случайной матрицы 200 на 200 с геометрически распределенными сингулярными значениями.

A = gallery('randsvd',200);

Использование svdsketch вычислить SVD низкорангового приближения A. Задайте допуск 1e-2, и найти размер выхода S для определения ранга svdsketch использует для матричного эскиза.

tol = 1e-2;
[U,S,V] = svdsketch(A,tol);
size(S)
ans = 1×2

    60    60

Результаты показывают, что низкоранговое матричное приближение A имеет ранг 60.

Рассмотрим, насколько хорошо аппроксимируется матричный эскиз A путем сравнения A на U*S*V'.

norm(U*S*V' - A,'fro')/norm(A,'fro')
ans = 0.0048

Результат указывает, что матричный эскиз аппроксимируется A в пределах заданного допуска 1e-2.

Использование svdsketch с MaxSubspaceDimension опция на матрице, которая имеет медленно разрушающиеся сингулярные значения. Можно использовать эту опцию для принудительного svdsketch использовать подмножество функций A в матричном эскизе.

Создайте матрицу 5000 на 5000 со значениями, полученными из стандартного нормального распределения. Просмотрите распределение матричных сингулярных значений.

A = randn(5000);
semilogy(svd(A),'-o')

Figure contains an axes. The axes contains an object of type line.

Поскольку сингулярные значения в A медленно распадаются, A имеет много важные функции и не поддается низкоранговым приближениям. Чтобы сформировать матричный эскиз, который разумно аппроксимирует A, большинство или почти все функции должны быть сохранены.

Использование svdsketch на матрице с допуском 1e-5. Задайте четыре выхода, чтобы вернуть коэффициенты SVD, а также относительную ошибку приближения в каждой итерации.

tol = 1e-5;
[U1,S1,V1,apxError1] = svdsketch(A,tol);
size(S1)
ans = 1×2

        5000        5000

Размер S указывает, что, чтобы удовлетворить допуску, svdsketch необходимо сохранить все функции A. Для больших разреженных входных матриц это может представлять проблемы с памятью, поскольку низкоранговое приближение A формируется по svdsketch приблизительно совпадает с размером A и таким образом может не помещаться в памяти как плотная матрица.

Проверьте ошибку приближения выходов. Начиная с svdsketch сохраняет все в AВычисленный ответ точен, но вычисление было всего лишь дорогим способом вычисления svd(X).

apxError1(end)
ans = 1.9075e-08

Теперь выполните тот же расчет, но задайте MaxSubspaceDimension равным 650, чтобы ограничить размер подпространства, используемого для построения эскиза A. Это полезно для принудительного svdsketch использовать только подмножество функций в A чтобы сформировать матричный эскиз, уменьшая размер выходов.

[U2,S2,V2,apxError2] = svdsketch(A,tol,'MaxSubspaceDimension',650);
size(S2)
ans = 1×2

   650   650

Теперь выходные параметры имеют меньший размер.

Проверьте ошибку приближения новых выходов. Компромисс для принуждения выходов к меньшему заключается в том, что многие важные функции A должны быть опущены в матричном эскизе, и полученное приближение ранга 650 A не соответствует указанному допуску.

apxError2(end)
ans = 0.8214

Входные параметры

свернуть все

Входная матрица, заданная как разреженная или полная матрица. A обычно, но не всегда, большая и разреженная матрица. svdsketch лучше всего подходит для работы с дефицитными по неполному рангу матрицами, которые имеют относительно небольшое количество функций.

Типы данных: single | double
Поддержка комплексного числа: Да

Матричный допуск эскиза, заданный как действительный числовой скаляр в области значений sqrt(eps(class(A))) <= tol < 1.

svdsketch использует значение tol адаптивно определить, какие функции A для использования в низкоранговом приближении (матричный эскиз) A. Как значение tol увеличивает, svdsketch использует меньше функций A для формирования матричного эскиза.

Пример: [U,S,V] = svdsketch(A,1e-4)

Типы данных: single | double

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: [U,S,V] = svdsketch(A,1e-10,'MaxIterations',100) использует 100 итераций в svdsketch алгоритм.

Максимальная размерность подпространства, заданный как положительный целочисленный скаляр. Размерность подпространства управляет потреблением памяти svdsketch алгоритм. Если у алгоритма заканчивается память для заданного допуска, то можно задать меньшее значение для MaxSubspaceDimension так что алгоритм остается в памяти. Для примера настройка этого параметра может быть полезной при A имеет сингулярные значения, которые медленно разрушаются.

Когда вы задаете MaxSubspaceDimension опция, вы задаете максимальное значение в ранге матричного эскиза, используемого svdsketch. Поэтому, если svdsketch не может удовлетворить указанному допуску с рангом, меньшим MaxSubspaceDimension, он использует максимально допустимый ранг, и результирующие выходы могут не удовлетворять заданному допуску.

Пример: [U,S,V] = svdsketch(A,1e-7,'MaxSubspaceDimension',150)

Типы данных: single | double

Размер блока начального алгоритма, заданный как положительный целочисленный скаляр. Размер блока является количеством, на которое ранг матричного эскиза увеличивает каждую итерацию. Больший размер блока уменьшает количество необходимых итераций, делая больше работы на итерацию, но может также добавить больше информации к вычислению, чем необходимо для достижения сходимости.

Когда алгоритм протекает, svdsketch может настроить размер блока из начального значения, чтобы ускорить сходимость, если относительная ошибка приближения apxErr недостаточно быстро разрушается.

Если вы задаете BlockSize, значение должно быть меньше MaxSubspaceDimension.

Пример: [U,S,V] = svdsketch(A,1e-7,'BlockSize',10)

Типы данных: single | double

Максимальное количество итераций алгоритма, заданное как положительный целочисленный скаляр. Больше итераций может создать более качественный матричный эскиз за счет большего времени выполнения и более высокого потребления памяти.

Пример: [U,S,V] = svdsketch(A,1e-7,'MaxIterations',25)

Типы данных: single | double

Количество итераций степени, заданное как неотрицательный целочисленный скаляр. Итерации степени улучшают ортогональность U и V выходы. Обычно следует выбрать количество итераций степени, которые будут 0, 1, или 2, так как большие значения могут отрицательно способствовать ошибке округления.

Пример: [U,S,V] = svdsketch(A,1e-7,'NumPowerIterations',2)

Типы данных: single | double

Выходные аргументы

свернуть все

Левые сингулярные векторы матричного эскиза, возвращенные как матрица. Столбцы U являются ортонормальными, и они образуют набор базисных векторов для области значений матричного эскиза A.

Размер U зависит от значения tol. Как tol становится больше, svdsketch использует меньше функции матрицы входа для формирования матричного эскиза, поэтому U и V также меньше столбцов.

Различные машины и релизы MATLAB® может производить различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U и V могут переворачивать свои знаки, так как это не влияет на значение выражения A = U*S*V'.

Сингулярные значения матричного эскиза, возвращенные как квадратная диагональная матрица. Диагональные элементы S являются строго положительными сингулярными значениями матричного эскиза в порядке уменьшения.

Размер S зависит от значения tol. Когда допуск увеличивается, svdsketch использует меньше функции матрицы входа для формирования матричного эскиза, поэтому S соответственно меньше строк и столбцов.

Правые сингулярные векторы матричного эскиза, возвращенные как матрица. Столбцы V являются ортонормальными, и они образуют набор базисных векторов для ядра матричного эскиза A.

Размер V зависит от значения tol. Как tol становится больше, svdsketch использует меньше функции матрицы входа для формирования матричного эскиза, поэтому U и V также меньше столбцов.

Различные машины и релизы MATLAB могут производить различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U и V могут переворачивать свои знаки, так как это не влияет на значение выражения A = U*S*V'.

Относительная ошибка приближения в каждой итерации, возвращенная как вектор. Длина apxErr равен количеству итераций, используемых в svdsketch алгоритм. Использование MaxIterations для корректировки количества итераций.

Записи apxErr являются ли относительные ошибки приближения в каждой итерации, norm(U*S*V'-A,'fro')/norm(A,'fro'). Конечная запись в векторе apxErr(end) - относительное приближение ошибка выхода, возвращенная svdsketch.

Совет

  • Использовать svdsketch когда вы не знаете раньше времени, с каким рангом указывать svds, но вы знаете, какой допуск должно удовлетворять приближение SVD.

  • svds вычисляет лучшее возможное приближение SVD к рангу k (используя значение по умолчанию "largest" метод). svdsketch не гарантирует, что его ранг-k приближение является лучшим, что учитывает его преимущество скорости над svds.

Алгоритмы

svdsketch применяет допуск для формирования низкоранговой матрицы приближения AQB матрицы входа A. Это низкоранговое приближение называется матричным эскизом. Матричный эскиз сохраняет только важные функции от A, фильтрация ненужной информации. Относительная ошибка приближения apxErr матричного эскиза призван удовлетворить заданному допуску tol:

esketch=QBAFAFtol

Процесс svdsketch далее, чтобы сформировать матричный эскиз:

  • svdsketch формирует матричный эскиз итеративно, при этом каждая итерация добавляет новые столбцы в Q и новые строки к B. Новые столбцы и строки создаются путем извлечения функций из A использование матрицы случайных выборок. Вы можете управлять количеством столбцов и строк, добавленных в каждой итерации с помощью BlockSize Пара "имя-значение".

  • Во время каждой итерации, svdsketch использует итерации степени, чтобы улучшить ортогональность новых столбцов в Q. Можно настроить количество итераций степени с помощью NumPowerIterations Пара "имя-значение".

  • Итерации, образующие матричный эскиз, останавливаются, когда: количество столбцов в Q и строках в B достигает заданного значения для MaxSubspaceDimension, количество итераций достигает MaxIterations, или сходится относительная ошибка приближения (apxErr <= tol).

  • Чтобы улучшить скорость сходимости, svdsketch может увеличить заданное начальное значение для BlockSize от итерации к итерации, если распад в apxErr недостаточно.

После матричного эскиза AQB образуется, svdsketch вычисляет сингулярное разложение (SVD) матричного эскиза через [U1,S,V] = svd(B,'econ'), таким что

AQB=(QU1)SVH=USVH.

Если svdsketch способен отфильтровать некоторые функции A основываясь на заданном допуске, тогда результирующие коэффициенты SVD содержат меньше сингулярных значений и сингулярных векторов, чем если бы полный SVD был выполнен на A.

Ссылки

[1] Ю, Вэньцзянь, Юй Гу и Яохан Ли. Эффективные рандомизированные алгоритмы для низкоранговой Матрицы с фиксированной точностью Приближения. SIAM Journal по матричному анализу и применениям 39, № 3 (август 2018): 1339-1359. https://doi.org/10.1137/17M1141977.

Введенный в R2020b