1

所以我做了一个 AnnoyIndexer 并运行了一些 most_similar 查询以在 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?当然,在这样做之后,最大/最小距离都搞砸了吗?

4

1 回答 1

3

从 gensim 的文档中:

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

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

另请注意,此转换不会改变值之间的序数关系,请考虑0 < d1 < d2 < 1thend1/2 < d2/21 - d1/2 < 1 - d2/2,因此转换后 then 和 then的距离d1仍然比 更接近查询向量。o1d2o2o1o2

于 2018-08-17T22:12:21.717 回答