3

40*4 の行列と40 要素Mのベクトルがあります。M の各列ベクトルとAの間のコサイン距離を計算したいと思います。A

本当にこんなこと書く必要ある?

 print [cosine(M[:,i],A) for i in range(A.shape[1])]

または、これを行う別のより良い方法はありますか?

コサインのドキュメントはここで見ることができます: http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html#scipy.spatial.distance.cosine

ありがとう!

4

3 に答える 3

2

scipy.spatial.distance.cosine実際にはベクトルに対してのみ機能するようです。ベクトル化された式を使用してコサイン距離を効率的に計算するには、次のようにします。

normM = np.sqrt((M ** 2).sum(axis=0))
normA = np.sqrt((A ** 2).sum())
cossim = np.dot(M.T, A) / (normM * normA)
dist = 1. - cossim

M.shape == (40,4)A.shape == (4,)、およびどちらも ではないと仮定しnp.matrixます。

于 2012-11-03T17:39:22.690 に答える
2

この質問によると、Numpy には行列の列を反復処理する Pythonic の方法があるようです。このように、次のように書くことができます。

print [cosine(column,A) for column in M.transpose()]
于 2012-11-03T17:28:27.657 に答える
2

おそらく、より機能的な方法はfunctools.partial、 の 2 番目の引数をバインドしてcosineからA、 を使用mapしてこのバインドされた関数を の列に適用することです。M

map(partial(cosine,v=A), M.transpose())
于 2012-11-03T17:50:45.720 に答える