优化汉明距离 Python

jev*_*nio 1 python optimization numpy knn hamming-distance

我有大约 1M 的二进制 numpy 数组,我需要它们之间的汉明距离才能找到 k-最近邻,我得到的最快方法是使用 cdist,返回一个带距离的浮点矩阵。

由于我没有足够的内存来获得 1Mx1M 的浮点矩阵,所以我当时正在做一个元素,如下所示:

from scipy.spatial Import distance
Hamming_Distance = distance.cdist(array1,all_array,'hamming')
Run Code Online (Sandbox Code Playgroud)

问题是每个 Hamming_Distance 需要 2-3 秒,1m 文档需要一个永恒的时间(我需要将它用于不同的 k)。

有什么最快的方法吗?

我正在考虑多处理或在 C 上进行,但我在理解它如何在 python 上进行多处理时遇到了一些麻烦,我不知道如何将 C 代码与 Python 代码混合。

小智 5

如果要计算 k 最近邻,则可能不需要计算所有 n^2 对距离。相反,您可以使用 Kd 树或球树(两者都是用于有效查询一组点之间关系的数据结构)。

Scipy 有一个名为scipy.spatial.kdtree. 然而,它目前支持汉明距离作为点之间的度量。然而,scikit-learn(又名 sklearn)的优秀人员确实实现了支持汉明距离的球树。这是一个使用 sklearn 的球树的小例子。

from sklearn.neighbors import BallTree
import numpy as np

# Generate random binary data.
data = np.random.random_integers(0, 1, size=(10,10))

# Implement BallTree.
ballt = BallTree(data, leaf_size = 30, metric = 'hamming')
distances, neighbors = ballt.query(data, k=3)

print neighbors # Row n has the nth vector's k closest neighbors.
print distances # Same idea but the hamming distance to neighbors.
Run Code Online (Sandbox Code Playgroud)

现在有一个重要的警告。对于高维向量,KDTree 和 BallTree 变得可与蛮力算法相媲美。我对你的向量的性质有点不清楚,但希望上面的片段能给你一些想法/方向。