2016-09-11 8 views
2

現在、私は大規模な線形システムAx = bをSparkで解くことを検討しています。私は解決策を見つけるために多くの検索を行っており、thisリンクは、Aの擬似逆行列を計算して、次のステップとしてbで逆数を掛けるために見つけた唯一の解決策でした。簡単にするために、私はここで解決方法をコピーします。 Apache Sparkで大規模な線形システムを解く

import org.apache.spark.mllib.linalg.{Vectors,Vector,Matrix,SingularValueDecomposition,DenseMatrix,DenseVector} 
import org.apache.spark.mllib.linalg.distributed.RowMatrix 

def computeInverse(X: RowMatrix): DenseMatrix = { 
    val nCoef = X.numCols.toInt 
    val svd = X.computeSVD(nCoef, computeU = true) 
    if (svd.s.size < nCoef) { 
    sys.error(s"RowMatrix.computeInverse called on singular matrix.") 
    } 

    // Create the inv diagonal matrix from S 
    val invS = DenseMatrix.diag(new DenseVector(svd.s.toArray.map(x => math.pow(x,-1)))) 

    // U cannot be a RowMatrix 
    val U = new DenseMatrix(svd.U.numRows().toInt,svd.U.numCols().toInt,svd.U.rows.collect.flatMap(x => x.toArray)) 

    // If you could make V distributed, then this may be better. However its alreadly local...so maybe this is fine. 
    val V = svd.V 
    // inv(X) = V*inv(S)*transpose(U) --- the U is already transposed. 
    (V.multiply(invS)).multiply(U) 
    } 

この解決策の問題は最終的に、我々はUローカルDenseMatrix加える必要がありますし、私はそれが大きな行列のために可能ではないだろうと思うことですが

。私はこの問題を解決するために何か助けと考えを感謝します。

答えて

0

繰り返しアルゴリズムの1つ(e.g. PCG)を試すことができます。 Ax = bを直接解く代わりに、f(x)= 0.5x^tAx -x^tbを最小化するxを検索する。

パラレルPCGの場合、実際の反復は連続して行われる。それはあなたの労働者の間で共有される単純な乗算やその他の操作です。しかし、これにより、クラスタ全体に疎なマトリックスを配布することができます。

残念ながら、Sparkの線形代数ライブラリは進行中であり、私はあなたに表示するサンプルコードはありません。あなたの問題ではおそらくPCGよりも優れた方法があります.Sparkで実装するだけです。あなたの背景が何であるかはっきりしていませんが、線形方程式のシステムをどのように並行して解くことができるのかを一般的に調べることで始めることができます。

編集:さらに議論がありますherehereです。

+0

LSQRアルゴリズム[ここ](https://github.com/chocjy/randomized-LS-solvers/tree/master/src)のPython実装が見つかりました。 –

関連する問題