orthogonal_procrustes#
- scipy.linalg.orthogonal_procrustes(A, B, check_finite=True)[источник]#
Вычислить матричное решение ортогональной (или унитарной) задачи Прокруста.
Даны матрицы A и B той же формы, найти ортогональную (или унитарную в случае комплексного ввода) матрицу R который наиболее точно отображает A to B используя алгоритм, приведенный в [1].
Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.
- Параметры:
- A(M, N) array_like
Матрица для отображения.
- B(M, N) array_like
Целевая матрица.
- check_finitebool, необязательно
Проверять ли, что входные матрицы содержат только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, бесконечному выполнению), если входные данные содержат бесконечности или NaN.
- Возвращает:
- R(N, N) ndarray
Матричное решение ортогональной задачи Прокруста. Минимизирует норму Фробениуса
(A @ R) - B, при условииR.conj().T @ R = I.- scalefloat
Сумма сингулярных значений
A.conj().T @ B.
- Вызывает:
- ValueError
Если формы входных массивов не совпадают или если check_finite равен True и массивы содержат Inf или NaN.
Примечания
Обратите внимание, что в отличие от анализа Прокруста более высокого уровня для пространственных данных, эта функция использует только ортогональные преобразования, такие как вращения и отражения, и не использует масштабирование или перенос.
Добавлено в версии 0.15.0.
Ссылки
[1]Peter H. Schonemann, “A generalized solution of the orthogonal Procrustes problem”, Psychometrica – Vol. 31, No. 1, March, 1966. DOI:10.1007/BF02289451
Примеры
>>> import numpy as np >>> from scipy.linalg import orthogonal_procrustes >>> A = np.array([[ 2, 0, 1], [-2, 0, 0]])
Перевернуть порядок столбцов и проверить антидиагональное отображение
>>> R, sca = orthogonal_procrustes(A, np.fliplr(A)) >>> R array([[-5.34384992e-17, 0.00000000e+00, 1.00000000e+00], [ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00], [ 1.00000000e+00, 0.00000000e+00, -7.85941422e-17]]) >>> sca 9.0
В качестве примера унитарной задачи Прокруста, сгенерируйте случайную комплексную матрицу
A, случайная унитарная матрицаQ, и их произведениеB.>>> shape = (4, 4) >>> rng = np.random.default_rng() >>> A = rng.random(shape) + rng.random(shape)*1j >>> Q = rng.random(shape) + rng.random(shape)*1j >>> Q, _ = np.linalg.qr(Q) >>> B = A @ Q
orthogonal_procrustesвосстанавливает унитарную матрицуQизAиB.>>> R, _ = orthogonal_procrustes(A, B) >>> np.allclose(R, Q) True