scipy.linalg.
orthogonal_procrustes#
- scipy.linalg.orthogonal_procrustes(A, B, check_finite=True)[原始碼]#
計算正交(或么正)普羅克汝斯提斯問題的矩陣解。
給定相同形狀的矩陣 A 和 B,找到一個正交(或在複數輸入情況下為么正)矩陣 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_procrustes
從A
和B
中恢復么正矩陣Q
。>>> R, _ = orthogonal_procrustes(A, B) >>> np.allclose(R, Q) True