scipy.linalg.

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