我有大约1M的二进制numpy数组,我需要得到它们之间的汉明距离来找到de k-nearest-neighbors,我得到的最快的方法是使用cdist,返回一个带距离的浮点矩阵。
因为我没有足够的内存来获取1Mx1M浮点矩阵所以我当时正在做一个元素:
from scipy.spatial Import distance
Hamming_Distance = distance.cdist(array1,all_array,'hamming')
问题是每个Hamming_Distance需要2-3s,而1m文件则需要一个永恒(而且我需要将它用于不同的k)。
有没有最快的方法呢?
我正在考虑进行多处理或在C上进行处理但是我有一些麻烦,了解它如何在python上进行多处理,我不知道如何将C代码与Python代码混合。
答案 0 :(得分:4)
如果要计算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.
现在有一个重要的警告。对于高维向量,KDTree和BallTree变得与强力算法相当。我对你的向量的性质有点不清楚,但希望上面的代码片段给你一些想法/方向。