2016-06-25 9 views
5

私はベクトルのセットを持っており、コサインの類似性に基づいてトップ25の最も近いベクトルを取り出す必要があります。Pythonで多数のベクトルのコサイン類似度を素早く計算する方法は?

ScipyとSklearnは余弦距離/類似度2ベクトルの計算を実装していますが、100k X 100kサイズのCosine Simを計算してからtop-25を取り出す必要があります。 Pythonで速い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

各ベクトルについて、私は1つおきのベクトルとのコサイン類似度を計算し、コサイン類似度に関して各ベクトルに対して25個のベクトルを選択する。 – user3667569

+0

それはどれくらい速くしたいかによって決まります。実際には遅すぎるとサブサンプルに潜んでいる時間を使って実装例を表示し、希望のスピードが増えたら教えてくださいあなたはPythonでより良いアルゴリズムで加速することができますか、またはあなたがcythonまたはマルチスレッドに行く必要がある場合は... – Silmathoron

答えて

2

私がしようとするだろう賢くアルゴリズム最初ではなく、(ベクトルのすべてのペアを計算する)ブルートフォースをスピードアップ - @Silmathoron提案を1として

が、これは私がやっているものです。あなたのベクトルの次元が小さい場合は、KDTrees、scipy.spatial.KDTree()が動作します。それらが高次元である場合は、最初にランダム投影が必要な場合があります。 http://scikit-learn.org/stable/modules/random_projection.html

関連する問題