我希望重构SVD分解后的原始矩阵(近似值)。有没有一种方法可以在不将V因子本地矩阵转换为DenseMatrix的情况下完成这个过程?这是基于documentation的分解(请注意,注释来自文档示例)。
为了重建原始矩阵,我需要计算 U * 对角线(s) * 转置(V)。
首先要将奇异值向量 s 转换成对角矩阵 S。
但是当我尝试计算 U * 对角线(s) * 转置(V) 时,出现了以下错误。
我遇到了以下错误:
有没有一种方法可以在不进行转换的情况下,从svd的输出中获取原始矩阵
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.SingularValueDecomposition
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.distributed.RowMatrix
val data = Array(
Vectors.dense(1.0, 0.0, 7.0, 0.0, 0.0),
Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))
val dataRDD = sc.parallelize(data, 2)
val mat: RowMatrix = new RowMatrix(dataRDD)
// Compute the top 5 singular values and corresponding singular vectors.
val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(5, computeU = true)
val U: RowMatrix = svd.U // The U factor is a RowMatrix.
val s: Vector = svd.s // The singular values are stored in a local dense vector.
val V: Matrix = svd.V // The V factor is a local dense matrix.
为了重建原始矩阵,我需要计算 U * 对角线(s) * 转置(V)。
首先要将奇异值向量 s 转换成对角矩阵 S。
import org.apache.spark.mllib.linalg.Matrices
val S = Matrices.diag(s)
但是当我尝试计算 U * 对角线(s) * 转置(V) 时,出现了以下错误。
val dataApprox = U.multiply(S.multiply(V.transpose))
我遇到了以下错误:
如果我将错误:类型不匹配; 找到:org.apache.spark.mllib.linalg.Matrix 需要:org.apache.spark.mllib.linalg.DenseMatrix
Matrix
V
转换为DenseMatrix
Vdense
,它就可以正常工作。import org.apache.spark.mllib.linalg.DenseMatrix
val Vdense = new DenseMatrix(V.numRows, V.numCols, V.toArray)
val dataApprox = U.multiply(S.multiply(Vdense.transpose))
有没有一种方法可以在不进行转换的情况下,从svd的输出中获取原始矩阵
dataApprox
的近似值?