• 在Scala IDEA for Eclipse或IDEA里程序编译实现与在Spark Shell下的对比(其实就是那么一回事)


      不多说,直接上干货!

       比如,我这里拿主成分分析(PCA)。

    1、主成分分析(PCA)的概念介绍

      主成分分析(PCA) 是一种对数据进行旋转变换的统计学方法,其本质是在线性空间中进行一个基变换,使得变换后的数据投影在一组新的“坐标轴”上的方差最大化,随后,裁剪掉变换后方差很小的“坐标轴”,剩下的新“坐标轴”即被称为 主成分(Principal Component) ,它们可以在一个较低维度的子空间中尽可能地表示原有数据的性质。主成分分析被广泛应用在各种统计学、机器学习问题中,是最常见的降维方法之一。PCA有许多具体的实现方法,可以通过计算协方差矩阵,甚至是通过上文提到的SVD分解来进行PCA变换。

    2、主成分分析(PCA)的变换

      MLlib提供了两种进行PCA变换的方法,第一种与上文提到的SVD分解类似,位于org.apache.spark.mllib.linalg包下的RowMatrix中,这里,我们同样读入上文中提到的mx.txt文件,对其进行PCA变换:

      在Spark  Shell里

    scala> import org.apache.spark.mllib.linalg.Vectors
    scala> import org.apache.spark.mllib.linalg.distributed.RowMatrix
    scala> val data = sc.textFile("mx.txt").map(_.split(" ").map(_.toDouble)).map(line => Vectors.dense(line))
    data: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MapPartitionsRDD[3] at map at :31
    //通过RDD[Vectors]创建行矩阵
    scala> val rm = new RowMatrix(data)
    rm: org.apache.spark.mllib.linalg.distributed.RowMatrix = org.apache.spark.mllib.linalg.distributed.RowMatrix@4397952a
    //保留前3个主成分
    scala> val pc = rm.computePrincipalComponents(3)
    pc: org.apache.spark.mllib.linalg.Matrix =
    -0.41267731212833847  -0.3096216957951525    0.1822187433607524
    0.22357946922702987   -0.08150768817940773   0.5905947537762997
    -0.08813803143909382  -0.5339474873283436    -0.2258410886711858
    0.07580492185074224   -0.56869017430423      -0.28981327663106565
    0.4399389896865264    -0.23105821586820194   0.3185548657550075
    -0.08276152212493619  0.3798283369681188     -0.4216195003799105
    0.3952116027336311    -0.19598446496556066   -0.17237034054712738
    0.43580231831608096   -0.023441639969444372  -0.4151661847170216
    0.468703853681766     0.2288352748369381     0.04103087747663084

      可以看到,主成分矩阵是一个尺寸为(9,3)的矩阵,其中每一列代表一个主成分(新坐标轴),每一行代表原有的一个特征,而a.mat矩阵可以看成是一个有4个样本,9个特征的数据集,那么,主成分矩阵相当于把原有的9维特征空间投影到一个3维的空间中,从而达到降维的效果。可以通过矩阵乘法来完成对原矩阵的PCA变换,可以看到原有的(4,9)矩阵被变换成新的(4,3)矩阵。

    scala> val projected = rm.multiply(pc)
    projected: org.apache.spark.mllib.linalg.distributed.RowMatrix = org.apache.spark.mllib.linalg.distributed.RowMatrix@2a805829
    scala> projected.rows.foreach(println)
    [12.247647483894383,-2.725468189870252,-5.568954759405281]
    [2.8762985358626505,-2.2654415718974685,1.428630138613534]
    [12.284448024169402,-12.510510992280857,-0.16048149283293078]
    [-1.2537294080109986,-10.15675264890709,-4.8697886049036025]

      需要注意的是,MLlib提供的PCA变换方法最多只能处理65535维的数据。

       在Scala IDEA for Eclipse或IDEA里程序编译实现

     

    参考

    http://mocom.xmu.edu.cn/article/show/58627a2faa2c3f280956e7ae/0/1

  • 相关阅读:
    linux-CPU和核概念
    Nginx学习——location+proxy_pass左斜杠问题彻底弄清
    es概念一句话简介和注意点
    es-字段类型整理(6.x及以上)
    Nginx学习——location和rewrite
    Nginx学习——proxy_pass
    Nginx学习——简介及常用命令
    第三方接口调用异常补偿机制实现实例记录
    postgres日志爆盘处理方案-转自DBA汪x
    Xshell连接本地 Virtualbo Ubuntu
  • 原文地址:https://www.cnblogs.com/zlslch/p/7497429.html
Copyright © 2020-2023  润新知