Spark MLlib - Basic Statistics 总结

来源:互联网 发布:挑战杯 知乎 编辑:程序博客网 时间:2024/04/24 10:11

   Spark MLlib - Basic Statistics

Basic Statisticsspark mllib中的第一部分,共包含六个函数:

1、Summery statistic(汇总统计)

2、Correlations(相关系数)

3、Stratified sampling(分层抽样)

4、Hypothesis Testing(假设检验)

5、Random data generation(随机数生成)

6、Kernel density estimation(核密度估计)

 

我感觉这几个应该是spark mllib 最常用的几个吧。

 

Summery statistic(汇总统计)

 

函数名:colStats()  返回对象类型:MultivariateStatisticalSummary

示例:

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

val summary: MultivariateStatisticalSummary = Statistics.colStats(observations)

println(summary.mean) 

println(summary.variance) 

println(summary.numNonzeros) 

 

Summary这个结果包含了几个成员:

Count:long(大小)        max:vector (每列的最大值)

Mean:vector(样本均值)     min:vector(每列最小值) 

normL1:vector(每列的L1范数)  normL2:vector(每列的欧几里得数)

numNonzeros:Vector(每列非零向量的个数) 

Variance:vector(样本方差)

 

 

 

Correlations(相关系数)

 

Correlations,相关度量,目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。相关系数是用以反映变量之间相关关系密切程度的统计指标。简单的来说就是相关系数绝对值越大(值越接近1或者-1),当取值为0表示不相关,取值为(0~-1]表示负相关,取值为(0, 1]表示正相关。则表示数据越可进行线性拟合。

 

Pearson计算公式:

 

Spearman计算公式:

 

 

函数名:corr    返回类型:double

示例:

val seriesX: RDD[Double] = ... // a series

val seriesY: RDD[Double] = ... // must have the same number of partitions and cardinality a 

val correlation: Double = Statistics.corr(seriesX, seriesY, "pearson")

val data: RDD[Vector] = ... // note that each Vector is a row and not a column

val correlMatrix: Matrix = Statistics.corr(data, "pearson")

 

Stratified sampling(分层抽样)

 

目前,spark对于分层抽样支持两个版本sampleByKey和sampleByKeyExact。它是一个根据RDD的Key-Value来抽样的功能,可以为每个key设置其被选中的概率。

 

函数名:sampleByKeysampleByKeyExact

示例:

val sc: SparkContext = ...

val data = ... // an RDD[(K, V)] of any key value pairs

val fractions: Map[KDouble] = ... // specify the exact fraction desired from each key

// Get an exact sample from each stratum

val approxSample = data.sampleByKey(withReplacement = false, fractions)

val exactSample = data.sampleByKeyExact(withReplacement = false, fractions)

 

使用sampleByKeyExact方法进行采样,该方法资源消耗较sampleByKey更大 //但采样后的大小与预期大小更接近。

以下是一个词频的分层抽样的示例:

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) val exactSample = wordCounts.sampleByKeyExact(false, fractions)

 

 

Hypothesis Testing(假设检验)

 

Spark目前支持皮尔森卡方检测(Pearson’s chi-squared tests),包括适配度检定和独立性检定。

适配度检测:适配度检测,Goodness of Fit test,验证一组观察值的次数分配是否异于理论上的分配。其 H0假设(虚无假设,null hypothesis)为一个样本中已发生事件的次数分配会服从某个特定的理论分配。通常情况下这个特定的理论分配指的是均匀分配,目前Spark默认的是均匀分配。

独立性检测:独立性检测,independence test,验证从两个变量抽出的配对观察值组是否互相独立。其虚无假设设是:两个变量呈统计独立性无假设

不同的输入类型决定了是做拟合度检验还是独立性检验。拟合度检验要求输入为Vector, 独立性检验要求输入是Matrix。

函数名:chiSqTest()

适配度检测示例:
val vc1:Vector=Vector.dense(1,7,2,3,18)

val a:ChiSqTestResult=Statistics.chiSqTestvcl

结果:

 

若p-value<<0.001则否定虚无假设(虚无假设默认均匀分布)

独立性检测示例:

现在分析一下吸烟与性别是否独立

 

吸烟

15

4

不吸烟

20

15

 

Val mat:Matriax=Matrices.dense(2,2,Array(15,20,4,15))

val a:ChiSqTestResult=Statistics.chiSqTestmat

 

Random data generation(随机数生成)

Random data generation,用于随机数的生成。RandomRDDs包下现支持正态分

布、泊松分布和均匀分布三种分布方式。可以生成double RDDs和vector RDDs。

函数名:normalRDD(sc, size, [numPartitions, seed])、

     normalVectorRDD(sc, numRows, numCols, [numPartitions, seed])

示例:

val u = normalRDD(sc, 1000000L, 10)//生成100个服从标准正态分面N(0,1)的随机RDD数据,10为指定的分区数

val v = u.map(x => 1.0 + 2.0 * x)//转换使其服从N(1,4)的正太分布

 

Kernel density estimation(核密度估计

 

kernel density estimation是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,由Rosenblatt (1955)Emanuel Parzen(1962)提出,又名Parzen窗(Parzen window)。

 

示例:

val sample = sc.parallelize(Seq(0.01.04.04.0))

val kd = new KernelDensity()

  .setSample(sample)

  .setBandwidth(3.0)

val densities = kd.estimate(Array(-1.02.05.0))

//setSample设置样本,setBandwidth设置高斯核的标准差

 

 

呈统计独立性。

检测三个步骤

 

0 0
原创粉丝点击