5
我有一套100万载体,我需要检索基于余弦相似性的前25名最接近的向量。如何在Python中快速计算大量向量的余弦相似度?
Scipy和Sklearn有用于计算余弦距离/相似度2矢量的实现,但我需要计算100k X 100k大小的余弦模拟,然后取出前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个矢量。 – user3667569
这取决于你想要它有多快......如果你向我们展示一个你需要花费时间的实现的例子(如果它真的太慢,可能在子样本上),并告诉我们期望的速度增加,那么我们可以告诉你是否可以通过更好的算法加速python或者如果你需要去cython或多线程... – Silmathoron