如果给出一个10个向量的列表,称为A代表不同的组。然后你有一个时间序列的向量v1,v2,...,vn,每个也是一个向量。我想知道是否有办法在A中为每个v1,v2,...,vn找到“最接近”的矢量,如果你定义了一些距离度量?
除了循环并只是比较所有条目之外,还有一种快速的方法吗?
编辑:不,我不会问如何做k-means或类似的东西。
答案 0 :(得分:16)
您可以使用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设置为A中的所有点,允许您在其中执行快速空间搜索。 这样的查询采用向量并返回A中最近的邻居:
>>> tree.query([0.5,0.5,0.5,0.5,0.5])
(1.1180339887498949, 3)
第一个返回值是最近邻居的距离,第二个返回值是A在A中的位置,这样你就可以得到它,例如:
>>> A[ tree.query([0.5,0.5,0.5,0.5,0.5])[1] ]
[1, 0, 1, 0, 1]
答案 1 :(得分:1)
如果您定义了一个指标,则可以在min函数中使用它:
closest = min(A, key=distance)