Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 用apachespark求解大型线性系统_Apache Spark_Matrix Inverse - Fatal编程技术网

Apache spark 用apachespark求解大型线性系统

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

我目前正在寻找解决一个大规模的线性系统,Ax=b使用火花。为了找到一个解决方案,我做了大量的搜索,而link是我找到的唯一一个计算a的伪逆的解决方案,以求逆并将其乘以b作为下一步。为了简单起见,我将在这里复制解决方案

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实现。