Pythonで疎行列を取り扱う

疎行列の扱い方について

疎行列は要素としてほとんどが0の値となる行列。例えばユーザー×映画のレーティングの行列を考えるとわかりやすい。 映画のデータが約1000個ぐらいあったとすると1000個全ての映画に対してレーティングをするユーザーはほとんどいないでしょう。例えば100個の映画にレーティングしたとしても900個の要素に対して0の値が入る。 このように0の値が非常に多い行列を疎行列という。 pythonで疎行列を取り扱う際、numpy行列にデータをそのまま入れるよりも、csc_matrixかcsr_matrixにしたほうがメモリ消費を抑えられて、計算速度も早い。

Scipyによる疎行列の計算

scipy.sparseモジュールに疎行列を扱うクラスがある。 覚えておけば良いのは以下3つぐらい。

  • lil_matrix
  • csr_matrix
  • csc_matrix

lil_matrixで値を設定して、csr_matrix, csc_matrixで計算をさせるというのが常套手段。 ちなみにlilはLInked List, csc, csrはCompressed Sparse Column(Row)の略。 csrは行の取り出しが、cscは列の取り出しが高速。

使用例

a        = sparse.lil_matrix((5,5))
a_csc = a.tocsc()
a_csr  = a.tocsr()

# 例えば3行目のデータをとりたい場合は
a_csr.getRow(3).todense()

参考

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

内部構造を知りたい場合はこの記事が参考になる。 hamukazu.com