1. SVD降维
1.1 概念
奇异值分解(Singular value decomposition)
现实世界里,为了实现类似特征值分解的计算,我们使用奇异值分解。奇异值分解适用于任何矩阵,如下所示,其中A是一个m*n的矩阵:
A=Um∗mΣm∗nVTn∗nA=Um∗mΣm∗nVn∗nT
其中
U 是一个m*m的正交矩阵,其向量被称为左奇异向量
V 也是一个n*n的正交矩阵,其向量被成为右奇异向量
Σ是一个m*n的矩阵,其对角线上的元素为奇异值,其余元素皆为0
当选取top k个奇异值时,可以将矩阵降维成为:
Am∗n≈Um∗kΣk∗kVTk∗n
1.2 用处
当计算的结果不需要十分精确时,某些变量对于我们来说意义是十分小的。当处理的数据维度十分巨大的时候,计算量变得很大,这时候就可以通过降维来去除不是那么重要的维度(如本例中的z维度),这些维度对最终的计算结果的影响远远小于其它的维度。数据降维,将复杂的维度简单化,减少运算量
1.3 细节
降维后的数据展示,大维度数据处理
1.4 Demo
package spark.mllib import org.apache.spark.mllib.linalg.distributed.RowMatrix import org.apache.spark.sql.SparkSession import org.apache.spark.{SparkConf, SparkContext} /** * Created by liuwei on 2017/7/13. */ object SVDTest { def main(args: Array[String]): Unit = { 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 var arr1:Array[Double] = new Array[Double](10000) for(i <- 0 to arr1.length-1){ arr1(i) = i%10 } // arr1.foreach(println) val v1 =Vectors.dense(arr1); val sparkConf = new SparkConf().setAppName("PCATest").setMaster("local[8]") val sc = new SparkContext(sparkConf) 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 rows = sc.parallelize(data) val mat: RowMatrix = new RowMatrix(rows) // Compute the top 5 singular values and corresponding singular vectors. val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(5, computeU = true) // U右奇异矩阵 val U: RowMatrix = svd.U // The U factor is a RowMatrix. U.rows.foreach(println) println("===============") // s奇异值向量 val s: Vector = svd.s // The singular values are stored in a local dense vector. println(s) println("===============") // V左奇异矩阵 val V: Matrix = svd.V // The V factor is a local dense matrix. println(V) } }