現在、私は大規模な線形システム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加える必要がありますし、私はそれが大きな行列のために可能ではないだろうと思うことですが
。私はこの問題を解決するために何か助けと考えを感謝します。
LSQRアルゴリズム[ここ](https://github.com/chocjy/randomized-LS-solvers/tree/master/src)のPython実装が見つかりました。 –