因此,我做了一个AnnoyIndexer,并正在运行一些most_like查询,以查找300维向量空间中某些向量的最近邻居。这是它的代码:

def most_similar(self, vector, num_neighbors):
    """Find the approximate `num_neighbors` most similar items.
    Parameters
    ----------
    vector : numpy.array
        Vector for word/document.
    num_neighbors : int
        Number of most similar items
    Returns
    -------
    list of (str, float)
        List of most similar items in format [(`item`, `cosine_distance`), ... ]
    """

    ids, distances = self.index.get_nns_by_vector(
        vector, num_neighbors, include_distances=True)

    return [(self.labels[ids[i]], 1 - distances[i] / 2) for i in range(len(ids))]


我想知道为什么返回的距离值都从1取走然后除以2?确定这样做之后,肯定会弄乱最大/最小距离吗?

最佳答案

从gensim的文档中:

"List of most similar items in format [(`item`, `cosine_distance`), ...]"


AnnoyIndex返回的距离是向量之间的欧式距离。因此,该方法需要将欧氏距离转换为余弦距离。余弦距离等于1 - e/2,其中e是欧氏距离值,因此是变换。有关等价的推导,请参见this

还要注意,此变换不会改变值之间的顺序关系,请考虑0 < d1 < d2 < 1然后d1/2 < d2/21 - d1/2 < 1 - d2/2,因此,如果d1o1d2的距离o2,则在转换o1保持比o2更接近查询向量。

关于python - 在gensim.similarities.index中了解AnnoyIndexer的most_like方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51903087/

10-12 23:27