矩陣中每一行是一個樣本,計算兩個矩陣樣本之間的距離,即成對距離(pair-wise distances),能夠採用 sklearn 或 scipy 中的函數,方便計算。html
sklearn: sklearn.metrics.pairwise_distancespython
scipy: scipy.spatial.distance_matrix(用於 p-norm) 或 scipy.spatial.distance.cdist(全部經常使用距離 metrics)linux
比較三者的運行時間:(都計算歐式距離)服務器
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 運行時間最長。
dom
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。spa
sklearn.metrics.pairwise_distances -- scikit-learn
sklearn.utils.parallel_backend — scikit-learn 0.22
scipy.spatial.distance_matrix -- SciPy
scipy.spatial.distance.cdist -- SciPycode