因此,我做了一个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/2
和1 - d1/2 < 1 - d2/2
,因此,如果d1
是o1
和d2
的距离o2
,则在转换o1
保持比o2
更接近查询向量。关于python - 在gensim.similarities.index中了解AnnoyIndexer的most_like方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51903087/