spark机器学习中的基本统计量

上节记录了spark机器学习的数据相关结构,主要是向量与矩阵,本节记录一些基于这些数据结构的统计量。

在做机器学习中,我们经常需要用到一些向量或者矩阵的统计量,比如求一个向量的均值、方差,求一堆向量的均值向量、协方差等等。

spark机器学习工具包主要是mllib,而里面的统计量主要调用的是Statistics类库。

  • 基本统计量与距离计算

基本统计量存在于Statistics库下面的colStats方法里面。注意的是colStats方法是以列作为统计量计算的。比如[1,2,3,4,5]与[1;2;3;4;5]一个是行向量,一个是列向量,如果你去调用方法colStats,结果是不一样的。

colStats方法可以计算每列最大值、最小值、平均值、方差值、L1范数、L2范数。举个例子,假设我有个数据是这样的:

1 2 3 4 5
4 2 6 7 1
3 8 5 2 7

其中每一行是一个向量,也就是有3个向量,求上述几种统计量的代码就如下:

//计算每列最大值、最小值、平均值、方差值、L1范数、L2范数、方差

import org.apache.spark.mllib.stat.Statistics
import org.apache.spark.mllib.linalg.Vectors

val data_path = "/Users/Desktop/data.txt"
val data = sc.textFile(data_path).map(_.split(" ")).map(f => f.map(f => f.toDouble))
val data1 = data.map(f => Vectors.dense(f))   
val stat1 = Statistics.colStats(data1)

println(s"max: ${stat1.max}")
println(s"max: ${stat1.min}")
println(s"max: ${stat1.mean}")
println(s"max: ${stat1.normL1}")
println(s"max: ${stat1.normL2}")
println(s"max: ${stat1.variance}")

scala>
max: [4.0,8.0,6.0,7.0,7.0]
min: [1.0,2.0,3.0,2.0,1.0]
mean: [2.6666666666666665,4.0,4.666666666666667,4.333333333333334,4.333333333333334]
normL1: [8.0,12.0,14.0,13.0,13.0]
normL2: [5.0990195135927845,8.48528137423857,8.366600265340756,8.306623862918075,8.660254037844387]
variance: [2.3333333333333335,12.0,2.3333333333333335,6.333333333333333,9.333333333333332]

可以看到代码是以列作为统计量进行统计的,如果你想统计每一行的向量的均值怎么办?转置一下即可。

上述也展示了关于一个向量的距离计算,包括normL1和normL2。这两种距离计算通常在计算两个向量的相似度的时候也用到,很普遍。

  • 相关系数计算

相关系数反应的是两个向量之间的相关程度的,取值范围是[-1, 1], 当取值为0表示不相关,取值为(0~-1]表示负相关,取值为(0, 1]表示正相关。实际中用于对两组数据的拟合或相似程度进行定量化分析的。

Statistics包里面计算相关系数有两种:Pearson相关系数、Spearman相关系数。如下:

val x1 = sc.parallelize(Array(1.0, 2.0, 3.0, 4.0))
val y1 = sc.parallelize(Array(0, 2.0, 4.0, 8.0))
val corr3 = Statistics.corr(x1, y1, "pearson")
val corr4 = Statistics.corr(x1, y1, "spearman")

println(s"pearson: ${corr3}")
println(s"spearman: ${corr4}")

scala>     println(s"pearson: ${corr3}")
pearson: 0.9827076298239905

scala>     println(s"spearman: ${corr4}")
spearman: 0.9999999999999981

  • 卡方检验

还有一种统计量反应两个向量间的假设检验的,即卡方检验。

MLlib当前支持用于判断拟合度或者独立性的Pearson卡方检验。不同的输入类型决定了是做拟合度检验还是独立性检验。拟合度检验要求输入为Vector, 独立性检验要求输入是Matrix。

val v1 = Vectors.dense(1.0, 9.0)
val v2 = Vectors.dense(1.0, 8.0)
val v3 = Vectors.dense(2.0, 7.0)

val c1 = Statistics.chiSqTest(v1, v2)
val c2 = Statistics.chiSqTest(v1, v3)

scala> c1: org.apache.spark.mllib.stat.test.ChiSqTestResult =
Chi squared test summary:
method: pearson
degrees of freedom = 1
statistic = 0.012499999999999999
pValue = 0.910979292510634
No presumption against null hypothesis: observed follows the same distribution as expected..

scala> c2: org.apache.spark.mllib.stat.test.ChiSqTestResult =
Chi squared test summary:
method: pearson
degrees of freedom = 1
statistic = 0.8642857142857141
pValue = 0.35254213749971275

卡方检验也是一种统计概率上的一致性衡量指标,上面例子可以看到,v1与v2的相似性置信度pValue高,而v1与v3则低一些,某些时候还是很有用的。


关注公号【AInewworld】,第一时间获取精彩内容
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值