【機器學習實戰】計算兩個矩陣的成對距離(pair-wise distances)


矩陣中每一行是一個樣本,計算兩個矩陣樣本之間的距離,即成對距離(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM