scipy.linalg.

orthogonal_procrustes#

scipy.linalg.orthogonal_procrustes(A, B, check_finite=True)[原始碼]#

計算正交(或么正)普羅克汝斯提斯問題的矩陣解。

給定相同形狀的矩陣 AB,找到一個正交(或在複數輸入情況下為么正)矩陣 R,使用 [1] 中給定的演算法,將 A 最接近地映射到 B

參數:
A(M, N) 類陣列

要映射的矩陣。

B(M, N) 類陣列

目標矩陣。

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,“正交普羅克汝斯提斯問題的廣義解”,Psychometrica – Vol. 31, No. 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_procrustesAB 中恢復么正矩陣 Q

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