矩陣中每一行是一個樣本,計算兩個矩陣樣本之間的距離,即成對距離(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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/57290.html
標籤:其他
上一篇:如何對手機的新型號銷量進行預測
