You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SciPy的Procrustes实现获取变换矩阵Q

用SciPy实现Procrustes变换并获取变换矩阵Q

完全可以用SciPy的scipy.spatial.procrustes完成老版本Procrustes库示例中的任务,核心是通过奇异值分解(SVD)推导得到变换矩阵$Q$,使得$AQ$尽可能接近矩阵$B$。以下是具体实现步骤:

步骤说明

  1. 数据中心化:Procrustes问题默认要求输入矩阵已中心化(每列均值为0),先对源矩阵$A$和目标矩阵$B$做中心化处理。
  2. 调用SciPy Procrustes函数:该函数返回中心化后的两个矩阵、相似性得分,但不会直接给出变换矩阵$Q$,需手动计算。
  3. 推导变换矩阵$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:40:25