数列同士のCOS類似度を計算する際の高速化について、質問させていただきます。
質問内容
- 行列Aに対して、rand2で定義したデータとのコサイン類似度を求めた、配列cos_listを得たい場合、
現在は、cos_simを内包表記で呼び出すことで、計算していますが、何らかの方法でここを高速化できないでしょうか?
Python
1import numpy as np 2import time 3def cos_sim(v1, v2): 4 return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) 5 6print("データ生成中...") 7rand1 = [ np.random.rand() for i in range(5000)] #5000個の乱数データを作成する。 #[0.43839043,0.8423294420,0.2342…] 8rand2 = [ np.random.rand() for i in range(5000)] #類似度を検索する対象となる乱数データ #[0.139043,0.9442446246420,0.231342…] 9A = np.array([rand1 for j in range(10000)],dtype=np.float32) #[[0.43839043,0.8423294420,0.2342…],[0.43839043,0.8423294420,0.2342…],[0.43839043,0.8423294420,0.2342…], …] 10print("データ準備完了") 11start = time.time() #時間計測用変数 12 13###------ーーーここを高速化したい。------ーーー 14cos_list =[ cos_sim(rand2,a) for a in A] #コサイン類似度リスト #[0.73141,0.73141,0.73141, ...] 15###------ーーー------ーーー------ーーーー 16#※あくまで例なのでデータは、Aの各データをrand1で固定しているので、10000個の同じコサイン類似度リストが求まります。 17 18print("完了時間:{0}".format(time.time() - start) + "[sec]") #>> 完了時間:2.42
以上、ご教授のほどよろしくお願い致します。
実行環境:Python3.X
CPU:仮想v6コア(AWS)
考えたこと
何となく、早やくなりそうだけど、やり方がわからないのですが、
イメージ的にこんな事がやりたい気がしています。
(一回1:1の関係でリスト化して、numpyで一気に全体に対してCOS類似度を求める?)
Python
1# target_list = [ cos_sim(rand2,a) for a in A] 2target_list = [[rand2,a] for a in A] 3#とりあえず、rand2の列とaの列を1:1の関係でリストに定義して、ここからnumpyの機能でCOS類似度を一気に求められないでしょうか・・・
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/27 23:23