从矢量集中查找最相关的矢量

时间:2017-10-29 19:34:32

标签: python algorithm vector graph tree

我有一组形状的矢量(1000,)(它的图像矢量表示),我需要找出它们中哪一个与其他的最密切相关(最相关的图像来表示该实体)。我正在经历许多算法,如kNN,但我没有任何经过训练的数据来比较这些矢量,我只有这些矢量。谁能告诉我需要使用哪种算法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

这完全取决于嵌入的类型/如何计算这些表示,并且没有使用此假设就没有工作算法!

您需要某种指标,它能够评估两个向量的相似性!

当你有这个指标时,天真的方法是比较所有的循环:

# linear-search
max_similarity = -inf
max_vector
for vector in all_vectors:
    similarity = similarity(my_vector, vector)
    if similarity > max_similarity:
        max_similarity = similarity
        max_vector = vector

对于某些指标,上述情况可以通过度量树和类似方法(基本上是kNN算法的内部)加速,这些方法试图使用基础度量的假设来修剪一些候选者(不是查看所有候选者)(结果在潜在的加速)。这些算法在高维度上变慢,但我不确定1000是否已经太多了!

如果您的假设/相似性基于欧几里德指标(使用sklearn' s KDTree),则为一个示例:

from sklearn.neighbors import KDTree
X = np.vstack(my_vectors)
tree = KDTree(X)
dist, ind = tree.query(my_vector, k=1)  # get nearest neighbor

这是一个很好的方法的一个例子是OpenFace,它完全建立在将面部映射到欧几里德空间的想法上(类似的面具有低欧氏距离)! (基础论文:FaceNet

还有BallTree支持更多指标!

from sklearn.neighbors import KDTree, BallTree

KDTree.valid_metrics
    ['cityblock', 'p', 'l2', 'chebyshev', 'l1', 'euclidean', 'minkowski', 
    'infinity', 'manhattan']

BallTree.valid_metrics
    ['braycurtis', 'cityblock', 'p', 'hamming', 'dice', 'l2', 'rogerstanimoto',
     'wminkowski', 'chebyshev', 'russellrao', 'sokalmichener', 'matching', 'l1',
     'haversine', 'pyfunc', 'kulsinski', 'seuclidean', 'mahalanobis', 'euclidean',
     'minkowski', 'sokalsneath', 'infinity', 'manhattan', 'jaccard', 'canberra']

再说一遍:第一句是最重要的一句!