Singular value decomposition (SVD)(奇异值分解)将矩阵分解为三个矩阵: U, Σ, 和 V,例如
解释 :
对于大型的矩阵,通常我们不需要完整的因式分解,而只需要顶点奇异值及相关的奇异向量.这可以节省存储,去噪和恢复矩阵的低阶结构.
如果我们保留k个奇异值(将n维空间映射到k维空间),则所得到的低阶矩阵的维数将是 :
我们假设 n 的数量低于 m 的数量.奇异值和右奇异向量派生于 Gramian(格拉姆) 矩阵
的特征值和特征向量.如果用户通过 computeU 参数请求,矩阵储存左奇异向量U,通过矩阵相乘计算得到 .实际使用的方法是通过计算成本来自动确定 :spark.mllib 为面向行的矩阵提供SVD功能,在RowMatrix类中提供.
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.Vectors import org.apache.spark.mllib.linalg.distributed.RowMatrix val data = Array( Vectors.sparse(5, Seq((1, 1.0), (3, 7.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) // 计算最明显的5个奇异值和相应的奇异变量 val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(5, computeU = true) val U: RowMatrix = svd.U // U是一个RowMatrix类. val s: Vector = svd.s // 奇异值存储在局部密集矢量中. val V: Matrix = svd.V // V是一个局部密集矩阵.
有关API的详细信息,请参阅SingularValueDecomposition Scala文档
在 Spark repo "examples/src/main/scala/org/apache/spark/examples/mllib/SVDExample.scala" 中查找完整示例代码.
如果 U 被定义为 IndexedRowMatrix ,则相同的代码适用于 IndexedRowMatrix.
Principal component analysis (PCA) 是一种统计方法来找到一个旋转,使得第一个坐标具有最大的方差可能,每个后续坐标依次具有最大的方差。旋转矩阵的列称为主要组件。 PCA广泛用于降维。
spark.mllib 支持 PCA,用于以行为导向的格式和任何向量存储的高和低密度矩阵。
以下代码演示如何计算 RowMatrix 上的主要组件,并使用它们将向量投影到低维空间中
import org.apache.spark.mllib.linalg.Matrix import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.linalg.distributed.RowMatrix val data = Array( Vectors.sparse(5, Seq((1, 1.0), (3, 7.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 4 principal components. // Principal components are stored in a local dense matrix. val pc: Matrix = mat.computePrincipalComponents(4) // Project the rows to the linear space spanned by the top 4 principal components. val projected: RowMatrix = mat.multiply(pc)
有关API的详细信息,请参阅 RowMatrix Scala docs
完整的示例代码在Spark repo 的"examples/src/main/scala/org/apache/spark/examples/mllib/PCAOnRowMatrixExample.scala" 文件中.
以下代码演示如何计算源向量中的主成分,并使用它们将向量投影到低维空间中,同时保留相关标签:
import org.apache.spark.mllib.feature.PCA import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.rdd.RDD val data: RDD[LabeledPoint] = sc.parallelize(Seq( new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 1)), new LabeledPoint(1, Vectors.dense(1, 1, 0, 1, 0)), new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)), new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 0)), new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)))) // Compute the top 5 principal components. val pca = new PCA(5).fit(data.map(_.features)) // Project vectors to the linear space spanned by the top 5 principal // components, keeping the label val projected = data.map(p => p.copy(features = pca.transform(p.features)))
有关API的详细信息,请参阅 PCA Scala docs文档
完整的代码在Spark repo 的'examples/src/main/scala/org/apache/spark/examples/mllib/PCAOnSourceVectorExample.scala'文件中.
为了运行上述应用程序,请按照Spark快速入门指南的 Self-Contained Applications 部分中提供的说明进行操作。确保将spark-mllib包含在您的构建文件中作为依赖。