首页 理论教育 基本统计分析方法探讨

基本统计分析方法探讨

时间:2023-06-21 理论教育 版权反馈
【摘要】:基本统计分析包括归总分析、关联、分层抽样、假设检验、随机数生成,下面对其一一介绍。所示为分层抽样。import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._import org.apache.spark.rdd.PairRDDFunctionsval sc:SparkContext=...val data=...//包含key-value键值对的RDDval fractions:Map[K,Double]=...//从每一层中获取准确的样本val approxSample=data.sampleByKeyval exactSample=data.sampleByKeyExact4.假设检验在统计分析中,假设检验是一个强大的工具,用来判断结果是否统计充分,还会用来判断结果是否为随机产生。

基本统计分析方法探讨

基本统计分析包括归总分析、关联(即相关性)、分层抽样假设检验随机数生成,下面对其一一介绍。

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)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈