scipy.linalg.

orthogonal_procrustes#

scipy.linalg.orthogonal_procrustes(A, B, check_finite=True)[源]#

计算正交(或酉)Procrustes 问题的矩阵解。

给定形状相同的矩阵 AB,找到一个正交(或在复数输入情况下为酉)矩阵 R,使其使用 [1] 中给出的算法将 A 最紧密地映射到 B

本文档假定数组参数具有指定的“核心”形状。但是,此函数的数组参数可能在核心形状之前附加额外的“批处理”维度。在这种情况下,数组被视为低维切片的批处理;有关详细信息,请参阅 批处理线性操作

参数:
A(M, N) 类数组对象

要映射的矩阵。

B(M, N) 类数组对象

目标矩阵。

check_finitebool, 可选

是否检查输入矩阵仅包含有限数。禁用此选项可能会提高性能,但如果输入包含无穷大或 NaN,则可能导致问题(崩溃、无法终止)。

返回:
R(N, N) ndarray

正交 Procrustes 问题的矩阵解。在 R.conj().T @ R = I 的约束下,最小化 (A @ R) - B 的 Frobenius 范数。

scale浮点数

A.conj().T @ B 的奇异值之和。

抛出:
ValueError

如果输入数组的形状不匹配,或者 check_finite 为 True 且数组包含 Inf 或 NaN。

注意

请注意,与更高层次的空间数据 Procrustes 分析不同,此函数仅使用旋转和反射等正交变换,不使用缩放或平移。

在 0.15.0 版本中新增。

参考文献

[1]

Peter H. Schonemann, “A generalized solution of the orthogonal Procrustes problem”, Psychometrica – Vol. 31, No. 1, 三月, 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

作为酉 Procrustes 问题的示例,生成一个随机复数矩阵 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_procrustesAB 中恢复酉矩阵 Q

>>> R, _ = orthogonal_procrustes(A, B)
>>> np.allclose(R, Q)
True