SVD降维

来源:互联网 发布:cad2016简体中文版mac 编辑:程序博客网 时间:2024/06/05 19:17

1. SVD降维

1.1 概念

奇异值分解(Singular value decomposition)

现实世界里,为了实现类似特征值分解的计算,我们使用奇异值分解。奇异值分解适用于任何矩阵,如下所示,其中A是一个m*n的矩阵:

A=UmmΣmnVTnnA=UmmΣmnVnnT

其中

U 是一个m*m的正交矩阵,其向量被称为左奇异向量

V 也是一个n*n的正交矩阵,其向量被成为右奇异向量

Σ是一个m*n的矩阵,其对角线上的元素为奇异值,其余元素皆为0

当选取top k个奇异值时,可以将矩阵降维成为:

AmnUmkΣkkVTkn

 

 

1.2 用处

当计算的结果不需要十分精确时,某些变量对于我们来说意义是十分小的。当处理的数据维度十分巨大的时候,计算量变得很大,这时候就可以通过降维来去除不是那么重要的维度(如本例中的z维度),这些维度对最终的计算结果的影响远远小于其它的维度。数据降维,将复杂的维度简单化,减少运算量

1.3 细节

降维后的数据展示,大维度数据处理

1.4 Demo

package spark.mllibimport org.apache.spark.mllib.linalg.distributed.RowMatriximport org.apache.spark.sql.SparkSessionimport 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)  }}