在NumPy中,命令numpy.corrcoef(X.T)
在计算矩阵X
中每一对可能的列之间的相关性时非常高效。我正在寻找一种类似的有效方法来计算二进制矩阵B
的每个可能列之间的 * 汉明 * 距离。有没有一个NumPy方法可以让我适应它?
我尝试使用SciPy的spatial.distance.pdist(X, metric = 'hamming')
,但它比NumPy的成对相关函数慢100倍。
根据@ frank-yellin的评论,我也尝试了spatial.distance.pdist(X, metric = 'cityblock')
,但这只加快了1. 7倍的计算速度-这是伟大的,但我正在寻找一个~ 100倍的速度,如果可能的话。
import random
import numpy as np
from scipy import spatial
import time
binary_matrix = np.random.randint(0,2,(1000,1500),dtype = 'int32')
start = time.time()
hamming_with_scipy = spatial.distance.pdist(binary_matrix.T, metric = 'hamming')
end = time.time()
print(f'Hamming takes {end-start} seconds with scipy')
start = time.time()
corr_with_numpy = np.corrcoef(binary_matrix.T)
end = time.time()
print(f'Correlation takes {end-start} seconds with numpy')
输出量:
Hamming takes 5.301102876663208 seconds with scipy
Correlation takes 0.03205609321594238 seconds with numpy
1条答案
按热度按时间k4ymrczo1#
我只是将
pdist
与一个自定义函数my_hamming
一起使用,并使用numba
装饰它。我得到了相当准确的时间使用。使用低级语言可能没有太大的潜力。我怀疑这是一个计算复杂性的问题,事实上:相关系数以二次时间计算(斜率为时间轴上的20倍至尺寸轴上的10倍(对于较大尺寸)),而距离计算为三次(斜率3)。
我认为它适用于大多数距离,因为它们需要迭代列向量的所有元素。
因此,总的来说,这些算法是不可比的。在某种程度上,您可以通过并行处理来加速这一点-但只能通过一个常数(最大CPU数)。