2017-02-18 11 views
1

私は大きな二次元を持っていますndarrayAと私は最大の固有値と関連する固有ベクトルのペアを取得するSVDを計算したいと思います。 NumPyのドキュメントを見ると、NumPyは完全なSVD(numpy.linalg.svd)のみを計算することができますが、SciPyは必要なもの(scipy.sparse.linalg.svds)を正確に実行するメソッドを持っていますが、疎行列ではAの変換を実行したくありません。追加の計算時間が必要になります。最大特異値NumPy `ndarray`

これまではAにSciPy svdsを直接使用しましたが、ドキュメントではndarrayをこれらのメソッドに渡すことを推奨していません。

ndarrayオブジェクトを受け入れる方法でこのタスクを実行する方法はありますか?

答えて

3

高密度Aアレイでsvdsを使用する場合は、引き続き使用してください。それを何かに変換する必要はありません。 svdsは必要なすべての適応を行います。

それはマニュアルだが

A言う:形状の上にSVDを計算する{疎行列、LinearOperator} アレイ(M、N)

しかしLinearOperatorは何ですか?これは、マトリックス製品を実行できる何かの周りのラッパーです。高密度アレイの場合はA.dotが適格です。

svdsのコードを見てください。 Aが線形演算子またはスパース行列でない場合、最初に行うことはA = np.asarray(A)です。その後、A.dot(hemetianA).dotを取得し、新しいLinearOperatorを作成します。

この機能では、疎なマトリックスには何も特別なものはありません。重要なのは、互換性のあるマトリックス製品です。これらの回で

ルック:A

In [358]: A=np.eye(10) 
In [359]: Alg=splg.aslinearoperator(A) 
In [360]: Am=sparse.csr_matrix(A) 
In [361]: timeit splg.svds(A) 
1000 loops, best of 3: 541 µs per loop 
In [362]: timeit splg.svds(Alg) 
1000 loops, best of 3: 964 µs per loop 
In [363]: timeit splg.svds(Am) 
1000 loops, best of 3: 939 µs per loop 

直接使用が最速です。タイミングループの外にいるときでも、変換は役に立ちません。

関連する問題