Spark MLlib - Basic Statistics
Basic Statistics是spark 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设置其被选中的概率。
函数名:sampleByKey、sampleByKeyExact
示例:
val sc: SparkContext = ...
val data = ... // an RDD[(K, V)] of any key value pairs
val fractions: Map[K, Double] = ... // 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.chiSqTest(vcl)
结果:
若p-value<<0.001则否定虚无假设(虚无假设默认均匀分布)
独立性检测示例:
现在分析一下吸烟与性别是否独立
| 男 | 女 |
吸烟 | 15 | 4 |
不吸烟 | 20 | 15 |
Val mat:Matriax=Matrices.dense(2,2,Array(15,20,4,15))
val a:ChiSqTestResult=Statistics.chiSqTest(mat)
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.0, 1.0, 4.0, 4.0))
val kd = new KernelDensity()
.setSample(sample)
.setBandwidth(3.0)
val densities = kd.estimate(Array(-1.0, 2.0, 5.0))
//setSample设置样本,setBandwidth设置高斯核的标准差
呈统计独立性。
检测三个步骤