簡體   English   中英

優化漢明距離Python

[英]Optimize Hamming Distance Python

我有大約1M的二進制numpy數組,我需要獲取它們之間的漢明距離以找到de k-nearest-neighbours,最快的方法是使用cdist,並返回帶距離的float矩陣。

由於我沒有足夠的內存來獲取1Mx1M浮點矩陣,因此我正在像這樣在一個元素上執行此操作:

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

問題是每個Hamming_Distance花費2-3s,直到1m文檔花費了一個永恆的時間(我需要將其用於不同的k)。

有什么最快的方法嗎?

我正在考慮進行多處理或在C上進行處理,但是在理解它如何在python上進行多處理時遇到了一些麻煩,而且我不知道如何將C代碼與Python代碼混合使用。

如果要計算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可以與蠻力算法相比。 我對您的向量的性質尚不清楚,但希望上面的代碼段能為您提供一些想法/方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM