scipy.spatial.

procrustes#

scipy.spatial.procrustes(data1, data2)[源代码]#

Procrustes 分析,用于两个数据集的相似性测试。

每个输入矩阵都是一组点或向量(矩阵的行)。空间的维度是每个矩阵的列数。给定两个大小相同的矩阵,procrustes 会对两者进行标准化,使得

  • \(tr(AA^{T}) = 1\).

  • 两组点都以原点为中心。

Procrustes ([1], [2]) 然后将最佳变换应用于第二个矩阵(包括缩放/膨胀、旋转和反射)以最小化 \(M^{2}=\sum(data1-data2)^{2}\),即两个输入数据集之间逐点差异的平方和。

此函数并非设计用于处理具有不同数据点数量(行)的数据集。如果两个数据集具有不同的维度(列数不同),只需向较小的那个数据集添加零列即可。

参数:
data1array_like

矩阵,n 行表示 k(列)空间中的点。data1 是参考数据,在标准化后,data2 中的数据将被转换以拟合 data1 中的模式(必须具有 >1 个唯一点)。

data2array_like

k 空间中 n 行的数据,用于拟合 data1。必须与 data1 具有相同的形状 (numrows, numcols)(必须具有 >1 个唯一点)。

返回:
mtx1array_like

data1 的标准化版本。

mtx2array_like

最适合 data1data2 的方向。以中心为中心,但不一定是 \(tr(AA^{T}) = 1\)

disparityfloat

如上定义的 \(M^{2}\)

引发:
ValueError

如果输入数组不是二维的。如果输入数组的形状不同。如果输入数组具有零列或零行。

另请参见

scipy.linalg.orthogonal_procrustes
scipy.spatial.distance.directed_hausdorff

另一个用于两个数据集的相似性测试

注释

  • 差异不应依赖于输入矩阵的顺序,但输出矩阵会依赖,因为只有第一个输出矩阵保证被缩放为 \(tr(AA^{T}) = 1\)

  • 重复的数据点通常是可以接受的,重复一个数据点会增加其对 Procrustes 拟合的影响。

  • 差异与每个输入矩阵的点数成比例缩放。

参考文献

[1]

Krzanowski, W. J. (2000). “多元分析原理”。

[2]

Gower, J. C. (1975). “广义 Procrustes 分析”。

示例

>>> import numpy as np
>>> from scipy.spatial import procrustes

矩阵 ba 的旋转、平移、缩放和镜像版本

>>> a = np.array([[1, 3], [1, 2], [1, 1], [2, 1]], 'd')
>>> b = np.array([[4, -2], [4, -4], [4, -6], [2, -6]], 'd')
>>> mtx1, mtx2, disparity = procrustes(a, b)
>>> round(disparity)
0