numpy 有没有一种有效的方法来计算二进制矩阵中每一列之间的汉明距离?

cwdobuhd  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(98)

在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
k4ymrczo

k4ymrczo1#

我只是将pdist与一个自定义函数my_hamming一起使用,并使用numba装饰它。我得到了相当准确的时间使用。使用低级语言可能没有太大的潜力。我怀疑这是一个计算复杂性的问题,事实上:

相关系数以二次时间计算(斜率为时间轴上的20倍至尺寸轴上的10倍(对于较大尺寸)),而距离计算为三次(斜率3)。
我认为它适用于大多数距离,因为它们需要迭代列向量的所有元素。
因此,总的来说,这些算法是不可比的。在某种程度上,您可以通过并行处理来加速这一点-但只能通过一个常数(最大CPU数)。

相关问题