【问题标题】:Optimize Hamming Distance Python优化汉明距离 Python
【发布时间】:2016-11-22 03:54:04
【问题描述】:

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

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

from scipy.spatial Import distance
Hamming_Distance = distance.cdist(array1,all_array,'hamming')

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

有什么最快的方法吗?

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

【问题讨论】:

  • 您正试图暴力破解一个您在资源附近没有任何地方可以暴力破解的问题。找到最近邻居的方法比计算所有成对距离并取较小的距离要好得多。

标签: python numpy optimization knn hamming-distance


【解决方案1】:

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

Scipy 有一个名为 scipy.spatial.kdtree 的包。但是,它目前支持汉明距离作为点之间的度量。然而,scikit-learn(aka 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 变得可以与蛮力算法相媲美。我对你的向量的性质有点不清楚,但希望上面的 sn-p 能给你一些想法/方向。

【讨论】:

  • Balltree 可以查询 k-neighbours 和超过 radius-r,这很棒。我会检查它节省了多少时间,但它已经是比我更好的解决方案了,谢谢 xD
  • 这会导致需要更多时间进行详尽的搜索-.-
猜你喜欢
  • 2016-11-11
  • 1970-01-01
  • 2017-09-10
  • 2015-03-21
  • 2012-03-10
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多