モデルの縮小のために、行列の最大20の特異値に関連付けられた左特異ベクトルを計算したい 、 どこ そして 。残念ながら、私のマトリックス どんな構造もなしで密になります。
このサイズのランダムマトリックスに対してPython svd
のnumpy.linalg
モジュールからルーチンを呼び出すだけの場合、メモリエラーが発生します。これは、 分解のために 。
この落とし穴を回避するアルゴリズムが周りにありますか?たとえば、非ゼロの特異値に関連付けられた特異ベクトルのみを設定します。
計算時間と精度をトレードする準備ができています。
full_matrices
「ゼロ以外」の部分のみが計算されるようにFalseに設定するオプションがあります。それにもかかわらず、計算をさらに減らす方法はありますか?
numpy
バックエンドは、Fortranコードを使用して LAPACKE_dgesvd
、標準SVDルーチンを。ただし、通常、マトリックスはC_CONTIGOUS
(で確認matrix.flags
)です。したがって、Fortranアラインメントのデータをコピーします。さらに、lapackルーチンdgesvdの実行中に、マトリックスの別のコピー(または少なくともそのためのメモリ)が必要です。最初からメモリアラインメントがFortranスタイルであることを確認すると、1つのコピーを削除できます。