2017-03-31 12 views
0

Iはベクトルの行列間のコサイン類似度を計算しています、そして私はこのような疎行列で結果を得る:Pythonの疎な行列は重複するインデックスを削除しますか?

  • (0、26)0.359171459261
  • を(0、25)0.121145761751
  • (0、24)0.316922015914
  • (0、23)0.157622038039
  • (0、22)0.636466644041
  • (0、21)0.136216495731
  • (0、20)0.243164535496
  • (0、19)0.348272617805
  • (0、18)0.636466644041
  • (0、17)1.0

しかし、例えば重複があります。

(0、24)0.316922015914及び(24、0)0.316922015914

私がしたいのは、それらをインデクスで削除して(もし私が(0,24)を持っていれば、それは同じなので(24,0)は必要ありません)行列内のすべてのベクトルに対して、2番目のベクトルです。 は現在、私はマトリックスを作成するために、次のコードを持っている:

vectorized_words = sparse.csr_matrix(vectorize_words(nostopwords,glove_dict)) 
cos_similiarity = cosine_similarity(vectorized_words,dense_output=False) 

だから私は、私はどちらか一方しかが神託の方法を使用しておくことにしたい、すべての重複を削除する必要はありません要約します。

ありがとうございます!

+0

'vectorize_words'と' cosine_similarity'はどこから来ますか? 'cos_similarity'を生成している間に' duplicates 'を削除する方が、後で行列から削除する方が簡単でしょう。'疎な(sparse)'行列は個々の要素操作のために設計されていません。 – hpaulj

+0

'scipy.spatial.distance.squareform'は、重複を排除するコンパクトなupper_triangle形式に/から変換します。疎な行列で動作するバージョンがあるかどうかわかりません。 – hpaulj

+0

@hpaulj cosine_similarityはsklearnから来て、単語をベクトル化することは、各単語ベクトルを取得する私の関数です – nitheism

答えて

1

私はそれがcoo形式の行列の上三角形を取得するのが最も簡単だと思う:cooに変換し、かつ低三角形データを設定し

In [876]: A = sparse.random(5,5,.3,'csr') 
In [877]: A = A+A.T 
In [878]: A 
Out[878]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>' 
    with 11 stored elements in Compressed Sparse Row format> 
In [879]: A.A 
Out[879]: 
array([[ 0.  , 0.  , 0.81388978, 0.  , 0.  ], 
     [ 0.  , 0.  , 0.73944395, 0.20736975, 0.98968617], 
     [ 0.81388978, 0.73944395, 0.  , 0.  , 0.  ], 
     [ 0.  , 0.20736975, 0.  , 0.05581152, 0.04448881], 
     [ 0.  , 0.98968617, 0.  , 0.04448881, 0.  ]]) 

まず小さな対称行列を作りますバック0~0

In [880]: Ao = A.tocoo() 
In [881]: mask = (Ao.row>Ao.col) 
In [882]: mask 
Out[882]: 
array([False, False, False, False, True, True, True, False, False, 
     True, True], dtype=bool) 
In [883]: Ao.data[mask]=0 

変換する値、およびマトリックスを整理するeliminate_zerosを使用します。

In [890]: A1 = Ao.tocsr() 
In [891]: A1 
Out[891]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>' 
    with 11 stored elements in Compressed Sparse Row format> 
In [892]: A1.eliminate_zeros() 
In [893]: A1 
Out[893]: 
<5x5 sparse matrix of type '<class 'numpy.float64'>' 
    with 6 stored elements in Compressed Sparse Row format> 
In [894]: A1.A 
Out[894]: 
array([[ 0.  , 0.  , 0.81388978, 0.  , 0.  ], 
     [ 0.  , 0.  , 0.73944395, 0.20736975, 0.98968617], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 0.05581152, 0.04448881], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  ]]) 

coocsr形式の両方がインプレースeliminate_zeros方法を有しています。代わりに、あなただけのlower_triangle値を排除するためのモデルとして、このコードをAo.data[mask]=0を使用して可能性の


def eliminate_zeros(self): 
    """Remove zero entries from the matrix 

    This is an *in place* operation 
    """ 
    mask = self.data != 0 
    self.data = self.data[mask] 
    self.row = self.row[mask] 
    self.col = self.col[mask] 

+0

"eliminate_zeros"はすべてゼロを削除しませんか?私は元の行列のどこかに0の値を持つかもしれないということを意味し、それも同様に削除されますか? – nitheism

+0

はい、そうです。 'coo'' elimin_zeros'のコードを 'mask'で直接動作させるために追加します。 – hpaulj

+0

ありがとう – nitheism

関連する問題