SparkMLlib----数理统计的基本概念

Posted 汪本成

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SparkMLlib----数理统计的基本概念相关的知识,希望对你有一定的参考价值。

基本统计量

数理统计中,基本统计量包括数据的平均值、方差,这是一组求数据统计量的基本内容。在MLlib中,统计量的计算主要用到Statistics类库,如下表:

类型名称释义
colStats以列为基础计算统计量的基本数据
chiSqTest对数据集内的数据进行皮尔逊距离计算,根据参量的不同,返回值格式有差异
corr对两个数据集进行相关系数计算,根据参量的不同,返回值格式有差异
从表中可看出,Statistics类中不同的方法代表不同的统计量的求法

统计量的基本数据

colstats是Statistics类计算基本统计量的方法,这里需要注意的是,其工作和计算是以列为基础进行计算,调用不同的方法获得不同的统计量值,其方法如下表所示:

方法名称释义
count行内数据个数                         
Max最大数值单位
Mean最小数值单位
normL1欧几里德距离
normL2曼哈顿距离
numNonzeros                      不包含0值的个数
variance标准差

数据的均值和标准差

这里需要求数据的均值和标准差,在自己的磁盘下建立一个文件,加入下面一组数据

1
2
3
4
5
6
7
8
代码部分参考代码实战部分

距离计算

除了一些基本统计量的计算,colStats方法中还包括两种距离的计算,分别是normL1和normL2,代表欧几里得距离和曼哈顿距离。这两种距离主要用以表达数据集内部长度的常用算法。具体见代码

相关系数计算

相关系数里面包括皮尔逊系数和斯皮尔曼相关系数,在代码时间中我分别用在了两组数据的相关系数计算和单个数据集之间相关系数的计算,具体使用参考代码部分

分层抽样

  分层抽样是一种数据提取算法,先将总体的单位按照某种特征分为若干次级总体(层),然后再从每一层内进行单纯的随机取样,组成一个样本的统计学计算方法。这种方法以前常常用于数据量比较大,计算处理非常不方便的情况。

  一般抽样时,将总体分成互不交叉的层,按照一定的比例,从各层次独立的抽取一定数量的个体,将各层次取出的个体合在一起作为样本,这种抽样方法是一种分层抽样。

  在MLlib中,使用Map作为分层抽样的数据标记,一般情况下,Map的构成是[key,value]格式,key作为数据组,而value作为数据标签进行处理。下面建立一个数据集,如下:

aa
bb
cc
aaa
bbb
ccc
对数据集的分层抽样详细请参考代码部分

假设检验

常用的假设检验方法是卡方检验。卡方检验是一种常用的假设检验方法,能够较好的对数据集之间的拟合度、相关性和独立性进行验证。MLlib中规定常用的卡方检验使用的数据集一般为向量和矩阵。

                                                     假设检验的常用术语介绍

自由度                                                             总体参数估计量中变量值独立自由变化的数目                                                
统计量不同方法下的统计量
P值显著性差异指标
方法卡方检验使用方法
卡方检验使用了皮尔逊计算法对数据集进行计算,得到最终结果P值,一般情况下,P<0.05是指数据集不存在显著性差异。

详细操作请看代码部分。

随机数

RandomRDDS类是随机数生成类,详细看代码部分

代码

package mllib

import org.apache.log4j.Level, Logger
import org.apache.spark.mllib.linalg.Matrices, Vectors
import org.apache.spark.mllib.random.RandomRDDs
import org.apache.spark.mllib.stat.Statistics
import org.apache.spark.SparkContext, SparkConf

/**
  * Created by 汪本成 on 2016/8/4.
  */
object MLlibTJ 

  //屏蔽不必要的日志显示在终端上
  Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
  Logger.getLogger("org.apache.eclipse.jetty.server").setLevel(Level.OFF)

  //程序入口
  val conf = new SparkConf().setAppName("MLlibTJ").setMaster("local[1]")
  val sc = new SparkContext(conf)

  val SUMMARYFILE_PATH = "G://c.txt"
  val CORRECTFILE_X_PATH = "G://x.txt"
  val CORRECTFILE_Y_PATH = "G://x.txt"
  val CORRECTFILE_SINGLE_PATH = "G://d.txt"
  val STRATIFIEDFILE_PATH = "G://e.txt"

  def main(args: Array[String]) 

    use_Summary1(SUMMARYFILE_PATH)
//      [4.5]
//      [6.0]

    use_Summary2(SUMMARYFILE_PATH)
//      [36.0]
//      [14.2828568570857]

    use_Correct1(CORRECTFILE_X_PATH, CORRECTFILE_Y_PATH)
//      0.9999999999999998

    use_SingleCorrect(CORRECTFILE_SINGLE_PATH)
//      1.0                 0.9999999999999998  0.9999999999999998  ... (5 total)
//      0.9999999999999998  1.0                 0.9999999999999998  ...
//      0.9999999999999998  0.9999999999999998  1.0                 ...
//      0.9999999999999998  0.9999999999999998  0.9999999999999998  ...
//      0.9999999999999998  0.9999999999999998  0.9999999999999998  ...

    use_StartifiedSampling(STRATIFIEDFILE_PATH)
    use_ChiSq()

//      Chi squared test summary:
//        method: pearson
//      degrees of freedom = 4
//      statistic = 3.333333333333333
//      pValue = 0.5036682742334986
//      No presumption against null hypothesis: 
//      observed follows the same distribution as expected..
//      --------------------------------------------
//      Chi squared test summary:
//        method: pearson
//      degrees of freedom = 2
//      statistic = 0.2799999999999999
//      pValue = 0.8693582353988059
//      No presumption against null hypothesis: 
//      the occurrence of the outcomes is statistically independent..

    use_RandomRDD()
  

  /**
    * 计算均值与标准差
 *
    * @param path  传入数据路径
    *
    * main中可以看到summary的实例将列数据的内容计算并存储,供下一步的数据分析使用
    */
  def use_Summary1(path: String) = 
    val rdd = sc.textFile(path)
      .map(_.split(' ')
      .map(_.toDouble))     //转化成Double类型
      .map(line => Vectors.dense(line))   //转化成Vector格式
    //获取Statistics实例
    val summary = Statistics.colStats(rdd)
    //计算均值
    println(summary.mean)
    //计算标准差
    println(summary.variance)
  

  /**
    * 计算曼哈顿距离和欧几里德距离
 *
    * @param path  传入数据路径
    */
  def use_Summary2(path: String) = 
    val rdd = sc.textFile(path)
      .map(_.split(' ')
      .map(_.toDouble))
      .map(line => Vectors.dense(line))
    val summary = Statistics.colStats(rdd)
    //计算曼哈顿距离
    println(summary.normL1)
    //计算欧几里德距离
    println(summary.normL2)
  


  /**
    * 计算皮尔逊相关系数
 *
    * @param pathX  x数据集合的传入路径
    * @param pathY  y数据集合的传入路径
    */
  def use_Correct1(pathX: String, pathY: String)  =
    val rddX = sc.textFile(pathX).flatMap(_.split(' ').map(_.toDouble))
    val rddY = sc.textFile(pathY).flatMap(_.split(' ').map(_.toDouble))
    //计算不同数据之间的相关系数
    val correlation: Double = Statistics.corr(rddX, rddY)
    println(correlation)
  


  /**
    * 计算斯皮尔曼相关系数
 *
    * @param pathX  x数据集合的传入路径
    * @param pathY  y数据集合的传入路径
    */
  def use_Correct2(pathX: String, pathY: String) = 
    val rddX = sc.textFile(pathX).flatMap(_.split(' ').map(_.toDouble))
    val rddY = sc.textFile(pathY).flatMap(_.split(' ').map(_.toDouble))
    //使用斯皮尔曼计算不同数据之间的相关系数
    val correlation: Double = Statistics.corr(rddX, rddY, "spearman")
    println(correlation)
  

  /**
    * 计算单个数据集之间的相关系数
 *
    * @param path  数据传入路径
    */
  def use_SingleCorrect(path: String) = 
    val rdd = sc.textFile(path)
      .map(_.split(' ')
      .map(_.toDouble))
      .map(line => Vectors.dense(line))
    //使用斯皮尔曼计算相关系数
    println(Statistics.corr(rdd, "spearman"))
  

  /**
    * 分层抽样
    *
    * @param path
    * fractions表示在层10.2,在层2中抽0.8
    * withReplacement false表示不重复抽样
    * 0表示随机的seed
    */
  def use_StartifiedSampling(path:String) = 
    val data = sc.textFile(path).map(row =>
      //判断字符数
      if (row.length == 3)
        (row, 1)
      else (row, 2)
    ).map(each => (each._2, each._1))
    data.foreach(println)
    println("SampleByKey:")
    //设定抽样格式
    val fractions: Map[Int, Double] = (List((1, 0.2), (2, 0.8))).toMap
    //计算抽样样本
    val approxSample = data.sampleByKey(withReplacement =false, fractions, 0)
    approxSample.foreach(println)
  

  /**
    * 假设检验
    */
  def use_ChiSq() = 
    val vd = Vectors.dense(1, 2, 3, 4, 5)
    val vdResult = Statistics.chiSqTest(vd)
    println(vdResult)
    println("--------------------------------------------")
    val mtx = Matrices.dense(3, 2, Array(1, 2, 3, 4, 5, 6))
    val mtxResult = Statistics.chiSqTest(mtx)
    println(mtxResult)
  

  /**
    * 随机数
    */
  def use_RandomRDD() = 
    val randomNum = RandomRDDs.normalRDD(sc, 100)
    randomNum.foreach(println)
  


运行结果虽然代码中有,这里我还是粘贴一下给大家看下:

"C:\\Program Files\\Java\\jdk1.8.0_77\\bin\\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\\Program Files (x86)\\JetBrains\\IntelliJ IDEA 15.0.5\\bin" -Dfile.encoding=UTF-8 -classpath "C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\charsets.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\deploy.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\access-bridge-64.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\cldrdata.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\dnsns.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\jaccess.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\jfxrt.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\localedata.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\nashorn.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\sunec.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\sunjce_provider.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\sunmscapi.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\sunpkcs11.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\ext\\zipfs.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\javaws.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\jce.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\jfr.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\jfxswt.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\jsse.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\management-agent.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\plugin.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\resources.jar;C:\\Program Files\\Java\\jdk1.8.0_77\\jre\\lib\\rt.jar;G:\\location\\spark-mllib\\out\\production\\spark-mllib;C:\\Program Files (x86)\\scala\\lib\\scala-actors-migration.jar;C:\\Program Files (x86)\\scala\\lib\\scala-actors.jar;C:\\Program Files (x86)\\scala\\lib\\scala-library.jar;C:\\Program Files (x86)\\scala\\lib\\scala-reflect.jar;C:\\Program Files (x86)\\scala\\lib\\scala-swing.jar;G:\\home\\download\\spark-1.6.1-bin-hadoop2.6\\lib\\datanucleus-api-jdo-3.2.6.jar;G:\\home\\download\\spark-1.6.1-bin-hadoop2.6\\lib\\datanucleus-core-3.2.10.jar;G:\\home\\download\\spark-1.6.1-bin-hadoop2.6\\lib\\datanucleus-rdbms-3.2.9.jar;G:\\home\\download\\spark-1.6.1-bin-hadoop2.6\\lib\\spark-1.6.1-yarn-shuffle.jar;G:\\home\\download\\spark-1.6.1-bin-hadoop2.6\\lib\\spark-assembly-1.6.1-hadoop2.6.0.jar;G:\\home\\download\\spark-1.6.1-bin-hadoop2.6\\lib\\spark-examples-1.6.1-hadoop2.6.0.jar;D:\\Program Files (x86)\\JetBrains\\IntelliJ IDEA 15.0.5\\lib\\idea_rt.jar" com.intellij.rt.execution.application.AppMain mllib.MLlibTJ
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/G:/home/download/spark-1.6.1-bin-hadoop2.6/lib/spark-assembly-1.6.1-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/G:/home/download/spark-1.6.1-bin-hadoop2.6/lib/spark-examples-1.6.1-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
16/08/04 23:56:19 INFO Slf4jLogger: Slf4jLogger started
16/08/04 23:56:19 INFO Remoting: Starting remoting
16/08/04 23:56:19 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkDriverActorSystem@192.168.1.100:22308]
16/08/04 23:56:21 INFO FileInputFormat: Total input paths to process : 1
16/08/04 23:56:21 INFO deprecation: mapred.tip.id is deprecated. Instead, use mapreduce.task.id
16/08/04 23:56:21 INFO deprecation: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
16/08/04 23:56:21 INFO deprecation: mapred.task.is.map is deprecated. Instead, use mapreduce.task.ismap
16/08/04 23:56:21 INFO deprecation: mapred.task.partition is deprecated. Instead, use mapreduce.task.partition
16/08/04 23:56:21 INFO deprecation: mapred.job.id is deprecated. Instead, use mapreduce.job.id
[4.5]
[6.0]
16/08/04 23:56:21 INFO FileInputFormat: Total input paths to process : 1
[36.0]
[14.2828568570857]
16/08/04 23:56:21 INFO FileInputFormat: Total input paths to process : 1
16/08/04 23:56:21 INFO FileInputFormat: Total input paths to process : 1
16/08/04 23:56:21 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
16/08/04 23:56:21 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS
0.9999999999999998
16/08/04 23:56:22 INFO FileInputFormat: Total input paths to process : 1
1.0                 0.9999999999999998  0.9999999999999998  ... (5 total)
0.9999999999999998  1.0                 0.9999999999999998  ...
0.9999999999999998  0.9999999999999998  1.0                 ...
0.9999999999999998  0.9999999999999998  0.9999999999999998  ...
0.9999999999999998  0.9999999999999998  0.9999999999999998  ...
16/08/04 23:56:22 INFO FileInputFormat: Total input paths to process : 1
(2,aa)
(2,bb)
(1,aaa)
(1,bbb)
(1,ccc)
SampleByKey:
(2,bb)
Chi squared test summary:
method: pearson
degrees of freedom = 4 
statistic = 3.333333333333333 
pValue = 0.5036682742334986 
No presumption against null hypothesis: observed follows the same distribution as expected..
--------------------------------------------
Chi squared test summary:
method: pearson
degrees of freedom = 2 
statistic = 0.2799999999999999 
pValue = 0.8693582353988059 
No presumption against null hypothesis: the occurrence of the outcomes is statistically independent..
-0.10141331820125939
0.350716991319483
1.331582069314933
1.2411239467574644
1.123188366179305
1.2002810888879651
-0.9642071015131543
0.12728482298051907
1.0871875725154698
-0.06353949927094865
-0.3001313809535367
-0.33608602071207266
-0.09266144286506449
2.588300332698856
2.3282167034438026
-0.16489076310817824
2.1626813832510092
-0.8536505806568009
1.0799720409871616
-1.5711939738980183
1.1187637715867582
1.234175841079391
-1.1872431502894643
-0.4222024779881765
0.004799417081699519
0.9833299531070834
-1.2615472974656752
0.34791710309114415
0.8637673602848094
0.2952870200848528
-0.034856404166047385
-0.21467840037690047
-0.9065353387686269
1.6406007912195368
-0.22691735288312365
0.21861365248866113
0.6588145701252803
-0.14255760106791696
0.8066676887788657
-1.139932034560967
-0.8920198860435904
-1.0976848416131606
-1.5391297378085964
1.0583493142995108
-0.7395179032857707
1.051798677664267
-2.4877509218914544
-1.309831257104661
0.4455975434827237
1.179350718331003
0.41424305467600614
-0.034516174563692686
0.3956000090586326
1.140372314106161
-0.7095208792311972
-1.101390862066466
0.7650319499517558
0.20532897974156095
-1.0303697774592164
-0.2096868498691188
-0.6818772448118033
-1.4588621828046586
-1.6894455164758004
1.0824636516155766
-2.1985703353135713
1.3098541600643898
-0.12496166802554712
1.205678112386295
0.23296762290890416
0.8165638199133599
-0.6119730460907017
-0.34079199854770736
0.3475481666714813
0.1920574356876942
-2.6281529446897847
-0.07515755154923556
1.0544607883102943
-0.6578493157577472
-0.18453594255170044
0.46886106834490343
-1.186376433189183
-0.08369806127136695
-2.236520126828275
0.5671831016189224
1.1901168697949147
1.5610353460632975
-0.06290623289954705
-0.47371094691633164
1.1616141552277377
0.01689852292949546
-0.424740341598052
-0.13860003379623714
0.9329750935469611
0.02783473112527479
-0.35039107979952594
1.078156023269959
0.052725045903936445
-0.7263863688050536
-0.09498816058464046
-0.6619960128814667
16/08/04 23:56:22 INFO RemoteActorRefProvider$RemotingTerminator: Shutting down remote daemon.

Process finished with exit code 0

以上是关于SparkMLlib----数理统计的基本概念的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习Spark]Spark MLlib实现数据基本统计

SparkMLlib学习之线性回归

随机信号分析学习笔记

SparkMLlib分类算法之决策树学习

信号检测与估计理论pdf

认识机器学习和MLlib