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 空間中要擬合到 data1 的 n 列資料。必須與 data1 具有相同的形狀 (numrows, numcols)(必須有 >1 個唯一點)。

返回:
mtx1array_like

data1 的標準化版本。

mtx2array_like

data2 最適合 data1 的方向。已居中,但不一定 \(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