Apache Spark MLlib学习笔记(三)MLlib统计指标之关联/抽样/汇总

决策树利用树形结构进行分类和回归,构建树的指标有多种,其中一种就是方差。在介绍决策树类算法前,首先介绍一下Spark MLlib中基本的统计。Spark官方提供了summary statistics、correlations、stratified sampling、hypothesis testing、random data generation。即汇总统计、关联、分层抽样、假设检验、随机数据生成。参考文档如下:
http://spark.apache.org/docs/latest/mllib-statistics.html
1、summary statistics(汇总统计)
Summary statistics提供了基于列的统计信息,包括6个统计量:均值、方差、非零统计量个数、总数、最小值、最大值。

import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}

val observations: RDD[Vector] = ... //  Vectors RDD

// 计算列统计量
val summary: MultivariateStatisticalSummary = Statistics.colStats(observations)
println(summary.mean) // 均值
println(summary.variance) // 方差
println(summary.numNonzeros) // 列非零值

2、Correlations(关联)
计算两个数据序列的相关度。相关系数是用以反映变量之间相关关系密切程度的统计指标。相关系数值越接近1或者-1,则表示数据越可进行线性拟合。目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。

import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.stat.Statistics

val sc: SparkContext = ...

val seriesX: RDD[Double] = ... // 序列1
val seriesY: RDD[Double] = ... // 必须和序列1具有相同的分区和数量

//  使用Pearson方法计算相关度, 若写 "spearman" 则使用 Spearman 方法。默认使用Pearson方法。
val correlation: Double = Statistics.corr(seriesX, seriesY, "pearson")

val data: RDD[Vector] = ... //  Vector 是行向量

// 使用 Pearson方法计算相关度矩阵,默认使用Pearson方法。
val correlMatrix: Matrix = Statistics.corr(data, "pearson")

3、Stratified sampling(分层抽样)
一个根据Key来抽样的功能,可以为每个key设置其被选中的概率。具体见代码以及注释
和其他统计方法不同,sampleByKey 和 sampleByKeyExact方法可以在RDD键值对上被执行。key可以被想象成一个标签和作为实体属性的值。例如,key可以是男女、文件编号,实体属性可以使人口中的年龄、文件中的单词。sampleByKey方法通过随机方式决定某个观测值是否被采样,因此需要提供一个预期采样数量。sampleByKeyExact 方法比使用简单随机抽样的sampleByKey方法需要更多的资源,但是它可以保证采样大小的置信区间为99.99%。

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

val sc: SparkContext = ...

val data = ... //  RDD[(K, V)] ,任意键值对
val fractions: Map[K, Double] = ... // 制定每个键的比例

// 进行采样
val approxSample = data.sampleByKey(withReplacement = false, fractions)
val exactSample = data.sampleByKeyExact(withReplacement = false, fractions)

4、Hypothesis testing(假设检验)
Spark目前支持皮尔森卡方检测(Pearson’s chi-squared tests),包括适配度检定和独立性检定。“适配度检定”验证一组观察值的次数分配是否异于理论上的分配。“独立性检定”验证从两个变数抽出的配对观察值组是否互相独立(例如:每次都从A国和B国各抽一个人,看他们的反应是否与国籍无关)。

import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.stat.Statistics._

val sc: SparkContext = ...

val vec: Vector = ... //由事件发生概率组成

// 计算适配度
val goodnessOfFitTestResult = Statistics.chiSqTest(vec)
println(goodnessOfFitTestResult)
 // 汇总结果,包括p值,自由度,检验统计量,所使用的方法,以及零假设。
val mat: Matrix = ... // 应急矩阵

// 根据输入矩阵计算 Pearson独立性检验
val independenceTestResult = Statistics.chiSqTest(mat) 
println(independenceTestResult)

val obs: RDD[LabeledPoint] = ... // (feature, label) 键值对 
val featureTestResults: Array[ChiSqTestResult] = Statistics.chiSqTest(obs)
var i = 1
featureTestResults.foreach { result =>
    println(s"Column $i:\n$result")
    i += 1
} // 输出结果

5、Random data generation(随机数据生成)
随机数据对于随机算法、原型设计和检验十分有用。Random data generation用于随机数的生成。Random RDDs包下现支持正态分布、泊松分布和均匀分布三种分布方式。
RandomRDDs提供随机double RDDS或vector RDDS。下面的例子中生成一个随机double RDD,其值是标准正态分布N(0,1),然后将其映射到N(1,4)。

import org.apache.spark.SparkContext
import org.apache.spark.mllib.random.RandomRDDs._

val sc: SparkContext = ...

// 生成一个随机的包含100w i.i.d值的double RDD,他们服从正态分布`N(0, 1)`, 并均匀的分布在 10 个分区。
val u = normalRDD(sc, 1000000L, 10)
// 将RDD映射到`N(1, 4)`.
val v = u.map(x => 1.0 + 2.0 * x)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值