scala – 如何计算Apache Spark中RowMatrix的反转?
发布时间:2020-12-16 18:59:04 所属栏目:安全 来源:网络整理
导读:我有一个以RowMatrix形式的X分布式矩阵.我使用的是Spark 1.3.0.我需要能够计算X逆. 解决方法 import org.apache.spark.mllib.linalg.{Vectors,Vector,Matrix,SingularValueDecomposition,DenseMatrix,DenseVector}import org.apache.spark.mllib.linalg.dist
我有一个以RowMatrix形式的X分布式矩阵.我使用的是Spark 1.3.0.我需要能够计算X逆.
解决方法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) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |