2015-09-07 44 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存储最近的距离 我返回发生这种情况的索引

希望这有助于。