2015-09-07 97 views
8

如果給出一個10個向量的列表,稱爲A,表示不同的組。然後你有一個時間序列的向量v1,v2,...,vn,每個向量也是一個向量。如果你定義了一些距離度量,我想知道是否有一種方法可以在A中爲每個v1,v2,...,vn找到「最接近」的矢量?從矢量列表中查找最接近的矢量| Python

有沒有一種快速的方法來做到這一點,除了循環和只是比較所有條目?

編輯:不,我不是問如何做k-means或類似的東西。

+1

可能的重複[如何使用Python對最近鄰居算法分類數據?](http://stackoverflow.com/questions/7326958/how-can-i-classify-data-with-the-nearest -neighbor-algorithm-using-python) – Sneftel

回答

12

可以使用spatial KDtree in scipy。它使用快速樹算法爲任意維度的向量確定靠近點。

編輯:對不起,如果您正在尋找arbitrary distance metrics,樹狀結構可能仍然是一個選項。

下面是一個例子:

>>> from scipy import spatial 
>>> A = [[0,1,2,3,4], [4,3,2,1,0], [2,5,3,7,1], [1,0,1,0,1]] 
>>> tree = spatial.KDTree(A) 

這將把KDTree在一所有點,讓您在其中執行快速搜索空間。 這種查詢採用的載體,並返回一種用於它最接近的鄰居:

>>> tree.query([0.5,0.5,0.5,0.5,0.5]) 
(1.1180339887498949, 3) 

第一復位值是最接近的鄰居的距離和在A中的第二其位置,使得可以獲取它例子是這樣的:

>>> A[ tree.query([0.5,0.5,0.5,0.5,0.5])[1] ] 
[1, 0, 1, 0, 1] 
+0

嗯,我看到。所以我應該在我的矩陣A中添加具有「10個不同的向量(組)」的KDTree。那麼,我只是簡單地遍歷我的整個系列的興趣,並做tree.query(data [i])?我嘗試過,輸出不是非常直觀,這種方法的文檔是非常缺乏... – ajl123

+0

是的,雖然你可以一次把它所有的點。按默認查詢返回A中給定的最接近的向量。然後它返回到該矢量的距離以及A中最接近的矢量的位置。 – haraldkl

1

如果定義指標,您可以在min功能使用:

closest = min(A, key=distance) 
+0

非常乾淨,但聽起來像OP是要求一個快速的方法來找到最接近的向量內A * *每個*向量雖然 – lemonhead

1

所以一些示例代碼是:

# build a KD-tree to compare to some array of vectors 'centall' 
tree = scipy.spatial.KDTree(centall) 
print 'shape of tree is ', tree.data.shape 

# loop through different regions and identify any clusters that belong to a different region 
[d1, i1] = tree.query(group1) 
[d2, i2] = tree.query(group2) 

這返回變量d和我。 d存儲最近的距離 我返回發生這種情況的索引

希望這有助於。