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

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

References

sklearn.metrics.pairwise_distances -- scikit-learn
sklearn.utils.parallel_backend — scikit-learn 0.22
scipy.spatial.distance_matrix -- SciPy
scipy.spatial.distance.cdist -- SciPycode

相關文章
相關標籤/搜索