矩陣中每一行是一個樣本,計算兩個矩陣樣本之間的距離,即成對距離(pair-wise distances),可以采用 sklearn 或 scipy 中的函數,方便計算。
sklearn: sklearn.metrics.pairwise_distances
scipy: scipy.spatial.distance_matrix(用於 p-norm) 或 scipy.spatial.distance.cdist(所有常用距離 metrics)
比較三者的運行時間:(都計算歐式距離)
import numpy as np
from sklearn.metrics import pairwise_distances
from scipy.spatial import distance_matrix
from scipy.spatial.distance import cdist
# 10-dimensional features
x = np.random.rand(400000).reshape((-1, 10))
y = np.random.rand(45000).reshape((-1, 10))
def option1():
dists = pairwise_distances(x, y)
def option2():
dists = distance_matrix(x, y)
def option3():
dists = cdist(x, y)
使用 pycharm 在 console 里用 timeit
查看運行時間,可以發現 scipy 的 scipy.spatial.distance.cdist 函數運行時間最短,sklearn.metrics.pairwise_distances 次之,scipy.spatial.distance_matrix 運行時間最長。
sklearn 在運行時,pairwise_distances 會占用大量 CPU 資源,在 linux 服務器上跑,32 個 CPU 核會都占滿,這是由於 pairwise_distances 並行造成的,生成的大量子進程會占滿所有 CPU 資源,即使設置 n_jobs = 1,也會有 31 個子進程生成。可能的原因是並行的最大進程數自動設置成了 max(cpu_count() // effective_n_jobs, 1),詳情請看 sklearn.utils.parallel_backend — scikit-learn 0.22。
scipy 的 cdist 函數又快,又沒有 sklearn 的 pairwise_distances 占 CPU,計算成對距離,請用 scipy.spatial.distance.cdist。
References
sklearn.metrics.pairwise_distances -- scikit-learn
sklearn.utils.parallel_backend — scikit-learn 0.22
scipy.spatial.distance_matrix -- SciPy
scipy.spatial.distance.cdist -- SciPy