ゼロでないものだけを保存する
大きな行列の多くは、ほとんどがゼロです。オプション価格付け用の格子は価格水準ごとに1行あり、各行は両隣としか関係しません。このような行列を疎行列と呼びます。ゼロをすべて保存するのはメモリと時間の無駄です。scipy.sparse はゼロでない要素だけを保存します。csr_matrix(圧縮疎行)形式は3つのリストを使います。data はゼロでない値を行ごとに並べ、indices は各値の列番号、indptr は各行が data の中でどこから始まりどこで終わるかを示します。行 は data[indptr[i]:indptr[i+1]] です。indptr の最後の数がゼロでない要素の数 nnz です。
形式ごとに向く仕事が違います。coo_matrix は(行, 列, 値)の三つ組をそのまま保存し、行列を作るのに簡単です。csr_matrix は行の切り出しと積 が速く、積は ではなく約 nnz 回の乗算で済みます。csc_matrix は列について同じ考え方で、dia_matrix は対角線を保存し帯行列に最適です。連立方程式 では、sparse.linalg.spsolve がゼロを利用して密な解法よりずっと速く解きます。疎が常に良いわけではなく、要素の約3分の1以上がゼロでないなら、管理の手間が節約を上回ります。金融では、価格付けの格子、ほとんどの負荷がゼロの因子モデル、強い相関だけを残す場合に疎性が現れます。
data=[5,1,2,3,4]、indices=[0,3,2,0,3]、indptr=[0,2,3,3,5] です。indptr[2]=indptr[3]=3 なので行 は空で、nnz=5 です。 を掛けると各行の和 が、わずか 回の乗算で得られます。差分法の価格付け格子のような の三重対角行列は、 個の要素のうちゼロでないものが 個で、密度は です。CSRなら約 KB、密なら MBです。実データでは、共有の価格ファイルの 銘柄の相関が の行列をなします。 の要素だけ残すと 個のうち 個()が残り、CSRは KB(密は KB)です。 では だけが残ります。- 3つのリスト:
data、indices、indptrがCSR行列を表し、indptr[-1]がゼロでない要素の数。 - COOで作り、CSRで計算する:三つ組は組み立てやすく、行ベースの保存は積や求解に速い。
- 疎が得になるのはほとんどがゼロのとき:ゼロでない要素が多いなら密な行列の方が良い。
ラボ:採点される内容
- ゼロでない要素の数10点
- 行の値の数10点
- 格子の密度10点
- 疎行列の積15点
- どの形式がどの仕事に向くか15点
- 三重対角系10点
- 疎が得になる場合とならない場合30点