如何通过SciPy的Procrustes实现获取变换矩阵Q
用SciPy实现Procrustes变换并获取变换矩阵Q
完全可以用SciPy的scipy.spatial.procrustes完成老版本Procrustes库示例中的任务,核心是通过奇异值分解(SVD)推导得到变换矩阵$Q$,使得$AQ$尽可能接近矩阵$B$。以下是具体实现步骤:
步骤说明
- 数据中心化:Procrustes问题默认要求输入矩阵已中心化(每列均值为0),先对源矩阵$A$和目标矩阵$B$做中心化处理。
- 调用SciPy Procrustes函数:该函数返回中心化后的两个矩阵、相似性得分,但不会直接给出变换矩阵$Q$,需手动计算。
- 推导变换矩阵$Q$:对中心化后的$A^T B$执行SVD分解,得到$U$、$\Sigma$、$V^T$,变换矩阵$Q = U V^T$。
完整代码示例
import numpy as np from scipy.spatial import procrustes # 模拟示例输入矩阵(可替换为实际数据) A = np.array([[1, 2], [3, 4], [5, 6]]) B = np.array([[2, 3], [4, 5], [6, 7]]) # 中心化处理 A_centered = A - A.mean(axis=0) B_centered = B - B.mean(axis=0) # 调用SciPy Procrustes A_proc, B_proc, disparity = procrustes(A_centered, B_centered) # 计算变换矩阵Q u, s, vh = np.linalg.svd(A_centered.T @ B_centered) Q = u @ vh # 验证AQ与B的近似程度 AQ = A_centered @ Q print("AQ与目标矩阵的差异:", np.linalg.norm(AQ - B_proc)) print("变换矩阵Q:") print(Q)
关键说明
- SciPy的
procrustes函数会自动对输入矩阵做缩放(使两个矩阵的平方和相等),若不需要缩放,可在计算$Q$后手动调整缩放因子,或直接基于原始中心化矩阵计算SVD。 - 上述代码中,$AQ$的结果与SciPy返回的$B_proc$几乎一致,满足Procrustes问题的最优近似要求。
内容的提问来源于stack exchange,提问作者Cypher
相关产品推荐
相关产品推荐

