scipy.linalg.
orthogonal_procrustes#
- scipy.linalg.orthogonal_procrustes(A, B, check_finite=True)[源代码]#
计算正交(或酉)普氏问题的矩阵解。
给定形状相同的矩阵 A 和 B,找到一个正交(或在复数输入的情况下为酉)矩阵 R,它使用 [1] 中给出的算法最接近地将 A 映射到 B。
- 参数:
- A(M, N) array_like
要映射的矩阵。
- B(M, N) array_like
目标矩阵。
- check_finitebool, 可选
是否检查输入矩阵是否仅包含有限数字。禁用可能会提高性能,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、不终止)。
- 返回:
- R(N, N) ndarray
正交普氏问题的矩阵解。在
R.conj().T @ R = I
的约束下,最小化(A @ R) - B
的 Frobenius 范数。- scalefloat
A.conj().T @ B
的奇异值之和。
- 引发:
- ValueError
如果输入数组形状不匹配,或者如果 check_finite 为 True 且数组包含 Inf 或 NaN。
说明
请注意,与空间数据的高级普氏分析不同,此函数仅使用正交变换(如旋转和反射),而不使用缩放或平移。
在版本 0.15.0 中添加。
参考文献
[1]Peter H. Schonemann,“正交普氏问题的广义解”,Psychometrica – 第 31 卷,第 1 期,1966 年 3 月。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
从A
和B
中恢复酉矩阵Q
。>>> R, _ = orthogonal_procrustes(A, B) >>> np.allclose(R, Q) True