因此,我做了一个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?这样确定之后,最大/最小距离肯定都弄乱了吗?
答案 0 :(得分: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
的1}}和d2
,然后在变换之后,o2
的查询向量比o1
更近。