【问题标题】:How to quickly calculate cosine similarity for large number of vectors in Python?如何在 Python 中快速计算大量向量的余弦相似度?
【发布时间】:2016-10-28 00:47:33
【问题描述】:

我有一组 100,000 个向量,我需要根据余弦相似度检索前 25 个最接近的向量。

Scipy 和 Sklearn 具有计算余弦距离/相似度 2 向量的实现,但我需要计算 100k X 100k 大小的余弦 Sim,然后取出前 25 个。 python 计算中是否有任何快速的实现?

根据@Silmathoron 的建议,这就是我正在做的 -

#vectors is a list of vectors of size : 100K x 400 i.e. 100K vectors each of dimenions 400
vectors = numpy.array(vectors)  
similarity = numpy.dot(vectors, vectors.T)


# squared magnitude of preference vectors (number of occurrences)
square_mag = numpy.diag(similarity)

# inverse squared magnitude
inv_square_mag = 1 / square_mag

# if it doesn't occur, set it's inverse magnitude to zero (instead of inf)
inv_square_mag[numpy.isinf(inv_square_mag)] = 0

# inverse of the magnitude
inv_mag = numpy.sqrt(inv_square_mag)

# cosine similarity (elementwise multiply by inverse magnitudes)
cosine = similarity * inv_mag
cosine = cosine.T * inv_mag

k = 26

box_plot_file = file("box_data.csv","w+")

for sim,query in itertools.izip(cosine,queries):
    k_largest = heapq.nlargest(k, sim)
    k_largest = map(str,k_largest)
    result = query + "," + ",".join(k_largest) + "\n"
    box_plot_file.write(result)
box_plot_file.close()

【问题讨论】:

  • “前 25 个最接近向量”是什么意思?最接近的前 25 对?还是别的什么?
  • 对于每个向量,我将计算与其他向量的余弦相似度,并根据余弦相似度为每个向量选择 25 个向量。
  • 这取决于您想要多快...如果您向我们展示您的实现示例以及所需时间(如果它真的太慢,可能在子样本上),并告诉我们想要的速度增加,那么我们可以告诉你它是否可以仅在 python 中使用更好的算法来加速,或者你是否需要使用 cython 或多线程......
  • Lucene 可能是一个不错的选择。假设您正在处理文本数据,您希望利用数据的稀疏特性。倒排索引可能会有所帮助。

标签: python vector scipy scikit-learn sklearn-pandas


【解决方案1】:

我会先尝试更智能的算法,而不是加速蛮力(计算所有向量对)。如果您的向量是低维的,KDTrees 可能会起作用,scipy.spatial.KDTree()。如果它们是高维度的,那么您可能首先需要一个随机投影: http://scikit-learn.org/stable/modules/random_projection.html

【讨论】:

  • 即使只有 64 维,KDTrees 也需要很长时间。
猜你喜欢
  • 2018-01-04
  • 2016-03-08
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2016-07-11
  • 2013-06-24
相关资源
最近更新 更多