Apache spark 用apachespark求解大型线性系统
我目前正在寻找解决一个大规模的线性系统,Ax=b使用火花。为了找到一个解决方案,我做了大量的搜索,而link是我找到的唯一一个计算a的伪逆的解决方案,以求逆并将其乘以b作为下一步。为了简单起见,我将在这里复制解决方案Apache spark 用apachespark求解大型线性系统,apache-spark,matrix-inverse,Apache Spark,Matrix Inverse,我目前正在寻找解决一个大规模的线性系统,Ax=b使用火花。为了找到一个解决方案,我做了大量的搜索,而link是我找到的唯一一个计算a的伪逆的解决方案,以求逆并将其乘以b作为下一步。为了简单起见,我将在这里复制解决方案 import org.apache.spark.mllib.linalg.{Vectors,Vector,Matrix,SingularValueDecomposition,DenseMatrix,DenseVector} import org.apache.spark.mllib
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)
}
import org.apache.spark.mllib.linalg.{向量,向量,矩阵,奇异值分解,DenseMatrix,DenseVector}
导入org.apache.spark.mllib.linalg.distributed.RowMatrix
def计算反转(X:RowMatrix):密度矩阵={
val nCoef=X.numCols.toInt
val svd=X.computeSVD(nCoef,computeU=true)
if(svd.s.尺寸math.pow(x,-1)))
//U不能是行矩阵
val U=新密度矩阵(svd.U.numRows().toInt,svd.U.numCols().toInt,svd.U.rows.collect.flatMap(x=>x.toArray))
//如果你能使V分布,那么这可能会更好。但是它已经是本地的了…所以也许这是好的。
val V=svd.V
//inv(X)=V*inv(S)*转置(U)--U已被转置。
(V)乘(invS)乘(U)
}
然而,这个解决方案的问题是,最终,我们将不得不使U成为一个局部密度矩阵,我认为这对于大型矩阵是不可能的。如果您能提供任何帮助和想法来解决这个问题,我将不胜感激。您可以尝试一种迭代算法()。不是直接求解Ax=b,而是搜索最小化f(x)=0.5x^tAx-x^tb的x 在并行PCG中,实际迭代是串行进行的;它是简单的乘法和其他操作,在您的工作人员之间共享。但这允许您在集群中分布稀疏矩阵 不幸的是,Spark的线性代数库正在开发中,我没有示例代码向您展示。对于您的问题,可能有比PCG更好的方法,我们只需要在Spark中实现它们。不确定你的背景是什么,但你可以从研究线性方程组如何并行求解开始
编辑:还有一些讨论和讨论。我找到了LSQR算法的python实现。