2016-06-25 5 views
5

나는 벡터 집합을 가지고 있으며 나는 코사인 유사성에 기초하여 가장 가까운 벡터를 찾아야한다.파이썬에서 다수의 벡터에 대한 코사인 유사성을 신속하게 계산하는 방법은 무엇입니까?

Scipy와 Sklearn은 코사인 거리/유사성 2 벡터를 계산하기위한 구현이 있지만 100k x 100k 크기의 Cosine Sim을 계산 한 다음 상위 25 개를 추출해야합니다. 파이썬에서 빠른 implemenet이 있습니까?

#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() 
+0

"상위 25 개의 가장 가까운 벡터"는 무엇을 의미합니까? 가장 가까운 25 쌍? 또는 다른 것? –

+0

각 벡터에 대해, 나는 다른 모든 벡터와의 코사인 유사도를 계산하고 코사인 유사성과 관련하여 각 벡터에 대해 25 개의 벡터를 선택합니다. – user3667569

+0

그것은 얼마나 빨리 원하는지에 달려 있습니다 ... 구현 시간의 예를 보여 주면 (잠재적으로 너무 느린 경우 서브 샘플에 잠재적으로) 원하는 속도 증가를 말하면 우리는 파이썬에서만 더 나은 알고리즘으로 가속화 될 수 있거나 파이썬이나 멀티 쓰레드로 갈 필요가 있다면 ... – Silmathoron

답변

2

내가 시도 할 것이다 똑똑한 알고리즘 첫번째보다는 (벡터의 모든 쌍을 계산) 무력을 가속화 - @Silmathoron 제안 사항에 따라

, 이것은 내가 뭐하는 거지입니다. 벡터의 크기가 작은 경우 KDTrees가 작동합니다 (scipy.spatial.KDTree()). 높은 차원 인 경우 먼저 임의의 투영이 필요할 수 있습니다. http://scikit-learn.org/stable/modules/random_projection.html

관련 문제