基本统计分析包括归总分析、关联(即相关性)、分层抽样、假设检验、随机数生成,下面对其一一介绍。
1.汇总统计
对RDD[Vector]格式数据的列汇总统计,用提供Statistics中的colStats方法来实现。colStats方法返回一个MultivariateStatisticalSummary实例,里面包括面向列的最大值、最小值、均值、方差、非零值个数以及总数量,如【例4-46】所示。
【例4-46】汇总统计示例。
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary,Statistics}
val observations:RDD[Vector]=...//an RDD of Vectors
//计算列汇总统计
val summary:MultivariateStatisticalSummary=Statistics.colStats(observations)
println(summary.mean)//每列的平均值
println(summary.variance)//每列的方差
println(summary.numNonzeros)//每列中非零值的个数
2.相关性
在统计分析中,计算两个系列数据之间的相关性很常见。在MLlib中,提供了用于计算多系列数据之间两两关系的灵活性算法。目前支持的相关性算法是Perarson相关和Spearsman相关。
Statistics提供了计算系列数据间相关性的方法。根据输入类型,输入两个RDD[Double]或RDD[Vector],将相应输出一个Double或相关矩阵,如【例4-47】所示。
【例4-47】相关系数的计算示例。
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]=...//一系列的数据
val seriesY:RDD[Double]=...//必须和seriesX拥有一样的分区和基数
//使用Pearson方法来计算相关性,如果没有指定方法,将会默认使用Pearson方法
val correlation:Double=Statistics.corr(seriesX,seriesY,"pearson")
val data:RDD[Vector]=...//该Vector是行向量而不是列向量
//使用Pearson方法来计算相关性,如果没有指定方法,将会默认使用Pearson方法
val correlMatrix:Matrix=Statistics.corr(data,"pearson")
3.分层抽样
在MLlib中,不同于其他统计方法,分层抽样方法如sampleByKey和sampleByKeyExact,运行在键值对格式的RDD上。对分层抽样来说,KEYS是一个标签,值是特定的属性。比如,KEY可以是男性或女性、文档ID,其相应的值可以是人口数据中的年龄列表或者文档中的词列表。sampleByKey方法对每一个观测掷币决定是否抽中它,所以需要对数据进行一次遍历,也需要输入期望抽样的大小。而sampleByKeyExact方法并不是简单地在每一层中使用sampleByKey方法进行随机抽样,它需要更多资源,但可提供置信度高达99.99%的精确抽样。
sampleByKeyExact允许使用者准确抽取[fk*nk] ∀k∈K个元素,这里的fk是从键k中期望抽取的比例,nk是从键k中抽取的键值对数量,而K是键集合。为了确保抽样大小,无放回抽样对数据会多一次遍历,然而,有放回的抽样会多两次遍历。【例4-48】所示为分层抽样。
【例4-48】分层抽样示例。
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.PairRDDFunctions(www.xing528.com)
val sc:SparkContext=...
val data=...//包含key-value键值对的RDD
val fractions:Map[K,Double]=...
//从每一层中获取准确的样本
val approxSample=data.sampleByKey(withReplacement=false,fractions)
val exactSample=data.sampleByKeyExact(withReplacement=false,fractions)
4.假设检验
在统计分析中,假设检验是一个强大的工具,用来判断结果是否统计充分,还会用来判断结果是否为随机产生。MLlib支持Pearson卡方校验(χ2)来测试适配度和独立性。输入数据类型决定了是否产生适配度或独立性。适配度校验需要Vector输入类型,而独立性测试需要一个矩阵输入。
MLlib也支持RDD[LabeledPoint]输入类型,然后使用卡方独立性测试来进行特征选择。【例4-49】是卡方检验方法示例。
【例4-49】卡方检验示例。
5.随机数据生成
随机数据生成对随机的算法、原型和性能测试来说是有用的。MLlib支持指定分布类型来生成随机RDD,如均匀分布、标准正态分布和泊松分布。
RandomRDD提供工厂方法来生成随机double RDD或者vector RDD。如【例4-50】所示生成一个随机的double RDD,其值服从标准正态分布N(0,1),然后将其映射为N(1,4)。
【例4-50】随机数生成示例。
import org.apache.spark.SparkContext
import org.apache.spark.mllib.random.RandomRDDs._
val sc:SparkContext=...
//生成100万个双精度的值,服从正态分布N(0,1),并均匀的分布在10个分区中
val u=normalRDD(sc,1000000L,10)
//转化为服从N(1,4)的双精度RDD
val v=u.map(x=>1.0+2.0*x)
5.随机数据生成
随机数据生成对随机的算法、原型和性能测试来说是有用的。MLlib支持指定分布类型来生成随机RDD,如均匀分布、标准正态分布和泊松分布。
RandomRDD提供工厂方法来生成随机double RDD或者vector RDD。如【例4-50】所示生成一个随机的double RDD,其值服从标准正态分布N(0,1),然后将其映射为N(1,4)。
【例4-50】随机数生成示例。
import org.apache.spark.SparkContext
import org.apache.spark.mllib.random.RandomRDDs._
val sc:SparkContext=...
//生成100万个双精度的值,服从正态分布N(0,1),并均匀的分布在10个分区中
val u=normalRDD(sc,1000000L,10)
//转化为服从N(1,4)的双精度RDD
val v=u.map(x=>1.0+2.0*x)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。