【问题标题】:Find most relevant Vector from set of vectors从向量集中找到最相关的向量
【发布时间】:2017-10-29 19:34:32
【问题描述】:

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

【问题讨论】:

    标签: python algorithm vector graph tree


    【解决方案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 的 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']
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多