Machine Learning on Spark——第四节 统计基础(二)

作者:周志湖
微信号:zhouzhihubeyond

本节主要内容

  1. Correlation 相关性分析
  2. 分层采样(Stratified sampling)
  3. 随机数据生成(Random data generation)

1. Correlation 相关性分析

相关性分析用于研究两个随机变量之间的依赖关系,它是统计学当中的一种十分重要的方法,在Spark中只实现了两种相关性分析方法,分别是皮尔逊(Pearson)与斯皮尔曼(Spearman)相关性分析方法,具体可参见。皮尔逊(Pearson)相关系数(具体参见:https://en.wikipedia.org/wiki/Correlation_coefficient)定义如下:

其中,协方差有如下定义形式:

方差具有如下定义形式:

标准差具有如下定义形式:

上述公式中的方差、标准差只能用来描述一维数据,协方差的意义在于其能够描述多维数据,如果结果为正值,则说明两者是正相关的,为负值则为负相关,值为0,则表示两者不相关,从上述几个公式的定义可以推出下列公式:

协方差可以将数据扩展到二维,对于n维数据,就需要计算

个协方差,此时自然而然地将其组织为协方差矩阵,例如一个三维变量x,y,z构成的协方差矩阵具有如下形式:

从上面的图可以看到:协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差。皮尔逊(Pearson)相关系数通过协方差矩阵便可得到。PearsonCorrelation在Spark中是私有成员,不能直接访问,使用时仍然是通过Statistics对象进行

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.stat._
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.{Matrix, Vector}

object CorrelationDemo extends App {
   val sparkConf = new SparkConf().setAppName("StatisticsDemo").setMaster("spark://sparkmaster:7077")
   val sc = new SparkContext(sparkConf)

   val rdd1:RDD[Double] = sc.parallelize(Array(11.0, 21.0, 13.0, 14.0))
   val rdd2:RDD[Double] = sc.parallelize(Array(11.0, 20.0, 13.0, 16.0))
   //两个rdd间的相关性
   //返回值:correlation: Double = 0.959034501397483
   //[-1, 1],值越接近于1,其相关度越高
   val correlation:Double = Statistics.corr(rdd1, rdd2, "pearson")

   val rdd3:RDD[Vector]= sc.parallelize(
      Array(
          Array(1.0,2.0,3.0,4.0),
          Array(2.0,3.0,4.0,5.0),
          Array(3.0,4.0,5.0,6.0)
          )
      ).map(f => Vectors.dense(f))
  //correlation3: org.apache.spark.mllib.linalg.Matrix =
  //1.0  1.0  1.0  1.0
  //1.0  1.0  1.0  1.0
  //1.0  1.0  1.0  1.0
  //1.0  1.0  1.0  1.0
   val correlation3:Matrix = Statistics.corr(rdd3, "pearson")
}

假设某工厂通过随机抽样得到考试成绩与产量之间的关系数据如下:

直观地看,成绩越高产量越高,如果使用pearson相关系数,将得到如下结果:

 val rdd4:RDD[Double] = sc.parallelize(Array(50.0, 60.0, 70.0, 80.0,90.0,95.0))
   val rdd5:RDD[Double] = sc.parallelize(Array(500.0, 510.0, 530.0, 580.0,560,1000))
//执行结果为:
//correlation4: Double = 0.6915716600436548
val correlation4:Double = Statistics.corr(rdd4, rdd5, "pearson")

但其实从我们观察的数据来看,它们应该是高度相关的,虽然0.69也一定程度地反应了数据间的相关性,但表达力仍然不够,为此可以引入Spearman相关系数(参见http://www.360doc.com/content/08/1228/23/50235_2219531.shtml),如表中的第四、第五列数据,通过将成绩和产量替换成等级,那它们之间的相关度会明显提高,这样的话表达能力更强,如下列代码所示:

//采用spearman相关系数
//执行结果:
//correlation5: Double = 0.9428571428571412
 val correlation5:Double = Statistics.corr(rdd4, rdd5, "spearman")

从上面的执行结果来看,相关性从pearson的值0.6915716600436548提高到了0.9428571428571412。由于利用的等级相关,因而spearman相关性分析也称为spearman等级相关分析或等级差数法,但需要注意的是spearman相关性分析方法涉及到等级的排序问题,在分布式环境下的排序可能会涉及到大量的网络IO操作,算法效率不是特别高。

2. 分层采样(Stratified sampling)

本小节使用spark自带的README.md文件进行相应的演示操作

package cn.ml.stat

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.PairRDDFunctions
import org.apache.spark.SparkConf

object StratifiedSampleDemo extends App {

 val sparkConf = new SparkConf().setAppName("StatisticsDemo").setMaster("spark://sparkmaster:7077")
 val sc = new SparkContext(sparkConf)
 //读取HDFS上的README.md文件
val textFile = sc.textFile("/README.md")
//wordCount操作,返回(K,V)汇总结果
val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)

//定义key为spark,采样比率为0.5
val fractions: Map[String, Double] = Map("Spark"->0.5)

//使用sampleByKey方法进行采样
val approxSample = wordCounts.sampleByKey(false, fractions)
//使用sampleByKeyExact方法进行采样,该方法资源消耗较sampleByKey更大
//但采样后的大小与预期大小更接近,可信度达到99.99%
val exactSample = wordCounts.sampleByKeyExact(false, fractions)
}

3. 随机数据生成(Random data generation)

scala> import org.apache.spark.SparkContext
import org.apache.spark.SparkContext

scala> import org.apache.spark.mllib.random.RandomRDDs._
import org.apache.spark.mllib.random.RandomRDDs._

//生成100个服从标准正态分面N(0,1)的随机RDD数据,10为指定的分区数
scala> val u = normalRDD(sc, 100L, 10)
u: org.apache.spark.rdd.RDD[Double] = RandomRDD[26] at RDD at RandomRDD.scala:38

//转换使其服从N(1,4)的正太分布
scala> val v = u.map(x => 1.0 + 2.0 * x)
v: org.apache.spark.rdd.RDD[Double] = MapPartitionsRDD[27] at map at <console>:27
时间: 2024-11-16 23:48:03

Machine Learning on Spark——第四节 统计基础(二)的相关文章

《Machine Learning with Spark》书评与作者访谈

机器学习是基于现有数据,通过数据驱动做出决策或者预测的技术.Apache Spark及其机器学习库MLlib为开发可伸缩的机器学习应用,提供了多种有用的算法.InfoQ采访了<Machine Learning with Spark>一书的作者Nick Pentreath,共同探讨了有关数据科学和机器学习的话题. By Srini Penchikala 机器学习以现有数据为基础创建模型,通过数据驱动,对未来做出决策或者预测.机器学习在最近几年获得大量的关注,因为它对企业与商业做出决策非常有帮助.

Machine Learning On Spark——第二节:基础数据结构(二)

作者:周志湖 微信号:zhouzhihubyond 本节主要内容 IndexedRowMatrix BlockMatrix 1. IndexedRowMatrix的使用 IndexedRowMatrix,顾名思义就是带索引的RowMatrix,它采用case class IndexedRow(index: Long, vector: Vector)类来表示矩阵的一行,index表示的就是它的索引,vector表示其要存储的内容.其使用方式如下: package cn.ml.datastruct

继Cloud,Machine Learning之后,OOW2017的第三个关键词

伴随着秋雨绵绵,我们郑重地向假日告别,从此迎来又一段筑梦的旅程. 刚刚过去的国庆中秋双节,Oracle OpenWorld 2017于美国旧金山隆重开幕,在这场盛大的技术盛宴上,通过来自现场的及时分享,我们感受创新和变革的力量.技术日新月异,无论个人和企业,不变革就面临淘汰.(拉里·埃里森亲自支招,数据库自动化之后,DBA何去何从?) 盖老师从以下五个方面概括了OOW2017的技术要点:云程发轫,扬帆起航:从物联网,到区块链:自治自动,推陈出新:Oracle 18c,明年发布:技术社区,开发者先

Awesome Machine Learning

  Awesome Machine Learning  A curated list of awesome machine learning frameworks, libraries and software (by language). Inspired by awesome-php. If you want to contribute to this list (please do), send me a pull request or contact me @josephmisiti A

第十四节--命名空间 -- Classes and Objects in PHP5 [14]

object|php5|命名空间 /*+-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有PHP爱好者共同进步! +---

基本教程篇--第三节、第四节

DateAxisSampleDemo.cs和TextAxisSampleDemo.cs介绍 第三节.第四节DateAxisSampleDemo.cs和TextAxisSampleDemo.cs介绍 由于这两个例子很简单也很相似,所以决定还是放到一起来写.按照惯例还是先给出代码和图示.

[C# 3.0 入门] [第一章 Lambda表达式] 第四节

[C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况 成问题的是,虽然为了源代码的简洁性,很想用Lambda表达式,但是要写的代码却不能全部都用Lambda表达式来写. 那么, Lambda表达式究竟能做到什么程度呢? 习惯了C/C++编程风格的程序员,一定以为因C#语法与之很相似,所以用C#编写相对复杂的程序应该也没有问题.可是很遗憾,情况不是这样.那是因为C/C++具有能写出复杂功能的表达式的逗号表达式,而C#却没有. 例如,

Learning Machine Learning, Part 2: Algorithms and Techniques

The previous blog post, Introduction to Machine Learning, presented the Machine Learning concept. Now, let's discuss representative methods used in the technology. Regression Algorithms In most Machine Learning courses, regression algorithms are the

Learning Machine Learning, Part 3: Application

This post features a basic introduction to machine learning (ML). You don't need any prior knowledge about ML to get the best out of this article. Before getting started, let's address this question: "Is ML so important that I really need to read thi