2017-07-29 171 views
2

私は3つのエントリを持つ複数のベクトルを含むDataFrameを持っています。各行は私の表現のベクトルです。これらのベクトルのそれぞれのコサインの類似度を計算する必要がありました。これを行列表現に変換する方が良いか、DataFrame自体にはよりクリーンなアプローチがありますか?PythonのDataframeの各行間のコサイン類似度

ここに私が試したコードがあります。

import pandas as pd 
from scipy import spatial 
df = pd.DataFrame([X,Y,Z]).T 
similarities = df.values.tolist() 

for x in similarities: 
    for y in similarities: 
     result = 1 - spatial.distance.cosine(x, y) 
+2

我々は適切にあなたを助けることができるようにあなたがこれまでにしようとしているものを共有してください。 –

+1

@JayanthPrakashKulkarni:あなたが使っているforループでは、行自体の類似性も計算しています。ネストされたループも必要ありません。行数-1を反復し、 'df.iloc [i、:]'と 'df.iloc [i + 1、:]'のコサインの類似度を計算します。あるいは、データフレームの 'apply'メソッドを調べることもできます。 –

+0

@ClockSlave貴重なご意見ありがとうございます。私は必ずDataFrameのapplyメソッドを使ってみます。 –

答えて

3

sklearn.metrics.pairwise.cosine_similarityをそのまま使用できます。

デモ

import numpy as np; import pandas as pd 
from sklearn.metrics.pairwise import cosine_similarity 

df = pd.DataFrame(np.random.randint(0, 2, 15)) 

df 
##  0 1 2 3 4 
## 0 1 1 1 0 0 
## 1 0 0 1 1 1 
## 2 0 1 0 1 0 

cosine_similarity(df) 
## array([[ 1.  , 0.33333333, 0.40824829], 
##   [ 0.33333333, 1.  , 0.40824829], 
##   [ 0.40824829, 0.40824829, 1.  ]]) 
関連する問題