疎行列-COO、CSR形式


Sparse Matrix疎行列について知りたいです.すべてのドキュメント内の単語をベクトル化すると、埋め込まれると次元が非常に大きくなり、マトリクスには非常に大きな0値が含まれます.このように、マトリクス内の要素の大部分がゼロに埋め込まれたマトリクスを疎マトリクスと呼ぶ

もう1つの説はDense Matrixであり,密行列と呼ばれる.BOW(Back of Word)形式の言語モデルの特徴ベクトル化は、通常、疎行列を作成します.
いずれにしても、疎マトリクスには不要な0値が多すぎて、メモリの無駄になります.これは、計算コストが高いことを意味します.

圧縮COO形式の疎行列


COOフォーマットは、ゼロ以外のデータの行と列を配列として保存する形式です.
[[3, 0, 1],
[0, 2, 0]]
上記の配列が存在する場合は、ゼロ以外のデータの行、列、およびデータを格納することで、元のマトリクスをロードできます.
from scipy import sparse

data = np.array([3, 1, 2])

row_pos = np.array([0, 0, 1])
col_pos = np.array([0, 2, 1])

sparse_coo = sparse.coo_matrix((data, row_pos, col_pos))

# 원본 행렬 출력
print(sparse_coo.toarray())

圧縮CSR形式の疎行列


このような単純な行列では、COOフォーマットを使用して疎行列を処理できますが、COOフォーマットを使用する場合、次の行と列のサイズは次のようになります.
data =[1, 5, 1, 4, 3, 2, 5, 6, 3, 2, 7, 8, 1]
row_pos = [0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5]
col_pos = [2, 5, 0, 1, 3, 4, 5, 1, 3, 0, 3, 5, 0]
データが行ごとに上から下へ並べ替えられていると判断した場合、row posが繰り返されます.インデックスはローで置き換えられ、値には各インデックス・ローの開始点が含まれます.
row_pos_ind = [0, 2, 7, 9, 10, 12]

from scipy import sparse

dense2 = np.array([[0,0,1,0,0,5],
             [1,4,0,3,2,5],
             [0,6,0,3,0,0],
             [2,0,0,0,0,0],
             [0,0,0,7,0,8],
             [1,0,0,0,0,0]])

# 0 이 아닌 데이터 추출
data2 = np.array([1, 5, 1, 4, 3, 2, 5, 6, 3, 2, 7, 8, 1])

# 행 위치와 열 위치를 각각 array로 생성 
row_pos = np.array([0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5])
col_pos = np.array([2, 5, 0, 1, 3, 4, 5, 1, 3, 0, 3, 5, 0])

# COO 형식으로 변환 
sparse_coo = sparse.coo_matrix((data2, (row_pos,col_pos)))

# 행 위치 배열의 고유한 값들의 시작 위치 인덱스를 배열로 생성
row_pos_ind = np.array([0, 2, 7, 9, 10, 12, 13])

# CSR 형식으로 변환 
sparse_csr = sparse.csr_matrix((data2, col_pos, row_pos_ind))

print('COO 변환된 데이터가 제대로 되었는지 다시 Dense로 출력 확인')
print(sparse_coo.toarray())
print('CSR 변환된 데이터가 제대로 되었는지 다시 Dense로 출력 확인')
print(sparse_csr.toarray())
SikittrunのCountVectorクラスとTfidVectorクラスで表される行列は、いずれもCSR形式である.

ソース

  • https://bkshin.tistory.com/entry/NLP-7-%ED%9D%AC%EC%86%8C-%ED%96%89%EB%A0%AC-Sparse-Matrix-COO-%ED%98%95%EC%8B%9D-CSR-%ED%98%95%EC%8B%9D