疎行列パッケージ、およびMATLABの同様のものは、大きな疎線形方程式(例えば、有限差分および有限要素実装)を解くなど、線形代数問題から開発されたアイデアに基づいています。したがって、マトリックス製品(数値配列の場合は
dot
製品)や方程式ソルバなどの要素がよく開発されています。
私の大まかな経験は、疎なcsr
マトリックス製品は、同等の高密度のdot
操作よりも高速であるために1%のスパース性がなければならないということです。言い換えれば、99個のゼロごとに1つの非ゼロ値です。 (ただし、以下のテストを参照)
しかし、人々はまた、メモリを節約するために希薄な行列を使用しようとします。しかし、そのような行列は3列の値を格納しなければならないことに留意してください(少なくともcoo
形式)。したがって、メモリの節約を開始するには、希薄さは1/3未満でなければなりません。明らかに、密な配列を最初に構築し、その配列から疎な配列を作成すると、メモリを節約することはできません。
scipy
パッケージには多くのスパースフォーマットが実装されています。 coo
形式は、理解して作成するのが最も簡単です。ドキュメントに従ってビルドし、その.data
、.row
、および.col
属性(3 1d配列)を見てください。
csr
およびcsc
は、通常coo
形式から作成され、データを少し圧縮するため、理解が少し難しくなります。しかし、彼らは数学の機能のほとんどを持っています。
csr
の形式をインデックスすることもできますが、一般的にこれは等価の密行列/配列の場合よりも遅くなります。値の変更(特に0から非ゼロへの変更)、連結、インクリメンタルな成長など、他の操作も遅くなります。
lil
(リストのリスト)もわかりやすく、段階的な構築に最適です。 dok
は実際には辞書サブクラスです。
重要な点は、疎な行列が2dに制限され、多くの点でnp.matrix
クラスのように振る舞います(サブクラスではありませんが)。
scikit-learn
とsparse
を使用して他の質問を検索すると、これらのマトリックスを使用する際の賛否両論を見つける最良の方法です。私はいくつかの質問に答えましたが、私は「疎」側が「学習」側よりも優れていることを知っています。私は彼らが役に立つと思うが、フィット感がいつもベストではないという感覚がある。カスタマイズはlearn
側にあります。これまでのところ、sparse
パッケージはこのアプリケーション用に最適化されていません。
私は指定されたスパースとスパース行列を作成するsparse.random
方法を使用して、いくつかの行列積テストを試みました。スパース行列の乗算は、予想よりも良好に実行されました。
In [251]: M=sparse.random(1000,1000,.5)
In [252]: timeit M1=M*M
1 loops, best of 3: 2.78 s per loop
In [253]: timeit Ma=M.toarray(); M2=Ma.dot(Ma)
1 loops, best of 3: 4.28 s per loop
サイズの問題です。小さい行列に対して密dot
は
In [255]: M=sparse.random(100,100,.5)
In [256]: timeit M1=M*M
100 loops, best of 3: 3.24 ms per loop
In [257]: timeit Ma=M.toarray(); M2=Ma.dot(Ma)
1000 loops, best of 3: 1.44 ms per loop
速いですが、追加のノート、scipyのダウンロードドキュメントパトリック・リンクは、実際にスパース行列を構築する方法の下部にあるいくつかの例を持っているためにとインデックス
In [268]: timeit M.tocsr()[500,500]
10 loops, best of 3: 86.4 ms per loop
In [269]: timeit Ma[500,500]
1000000 loops, best of 3: 318 ns per loop
In [270]: timeit Ma=M.toarray();Ma[500,500]
10 loops, best of 3: 23.6 ms per loop
を比較しますスクラッチから。 – cge
あなたは「ありがとう」というコメントを投稿するはずがないと知っていますが、それはすばらしい答えであり非常に有益なコメントです。みんなありがとう。 – patrick