概括统计 summary statistics [摘要统计]
单词
- linalg 分开
- linear + algebra: 线性代数
对于RDD[Vector]类型的变量,
Spark MLlib提供了一种叫colStats()的统计方法,调用该方法会返回一个类型为MultivariateStatisticalSummary的实例。
通过这个实例看,我们可以获得每一列的最大值,最小值,均值、方差、总数等。具体操作如下所示:
读取要分析的数据,把数据转变成RDD[Vector]类型:
上面我们就把莺尾花的四个属性,即萼片长度,萼片宽度,花瓣长度和花瓣宽度存储在 flower 中,类型为 RDD[linalg.Vector] 。
然后,我们调用colStats()方法,得到一个MultivariateStatisticalSummary类型的变量:
结果
- 样本大小
- 样本均值向量
- 样本方差向量 应该返回一个零向量,如果样本大小是1
- 每列的最大值
- 每列的最小值
- 每列的L1范数
- 每一列的欧几里得大小 欧几里德距离
- 每列中非零元素的数目 (包括显式显示的零值)
完整代码
package basicstatistics import org.apache.log4j.{Level, Logger} import org.apache.spark.SparkContext import org.apache.spark.mllib.linalg import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics} import org.apache.spark.rdd.RDD /** * 概括统计 summary statistics [摘要统计] * * 单词 * linalg 分开 * linear + algebra: 线性代数 * */ object SummaryStatistics { def main(args: Array[String]): Unit = { Logger.getLogger("org").setLevel(Level.ERROR) val sc = new SparkContext("local[*]", "") val observations: RDD[linalg.Vector] = sc.parallelize( Seq( Vectors.dense(1.0, 10.0, 100.0), Vectors.dense(2.0, 20.0, 200.0), Vectors.dense(3.0, 30.0, 300.0) ) ) /** * 对于RDD[Vector]类型的变量, * Spark MLlib提供了一种叫colStats()的统计方法,调用该方法会返回一个类型为MultivariateStatisticalSummary的实例。 * 通过这个实例看,我们可以获得每一列的最大值,最小值,均值、方差、总数等。具体操作如下所示: */ val summary: MultivariateStatisticalSummary = Statistics.colStats(observations) println("包含每列平均值的稠密向量\n"+summary.mean) // a dense vector containing the mean value for each column 包含每列平均值的稠密向量 println("列方差\n"+summary.variance) // column-wise variance 列方差 println("每列中的非零数\n"+summary.numNonzeros) // number of nonzeros in each colum 每列中的非零数 //读取要分析的数据,把数据转变成RDD[Vector]类型: val flower: RDD[linalg.Vector] = { //读取本地数据 sc.textFile("/home/rjxy/IdeaProjects/spark/spark_mllib_course/src/main/resources/data/iris.data") //转换数组 .map((_: String).split(",")) //转换RDD Vector .map((item: Array[String]) => { //稠密向量 double val strings: Array[String] = item.filter( item =>{ if (!item.equals("Iris-setosa") && !item.equals("Iris-versicolor") && !item.equals("Iris-virginica") ) true else false } ) Vectors.dense(strings.map(_.toDouble)) }) } //上面我们就把莺尾花的四个属性,即萼片长度,萼片宽度,花瓣长度和花瓣宽度存储在 flower 中,类型为 RDD[linalg.Vector] 。 // 然后,我们调用colStats()方法,得到一个MultivariateStatisticalSummary类型的变量: val summaryFlower: MultivariateStatisticalSummary = Statistics.colStats(flower) println( " 样本大小 "+summaryFlower.count ) println( " 样本均值向量 "+summaryFlower.mean ) println( " 样本方差向量。应该返回一个零向量,如果样本大小是1 "+summaryFlower.variance ) println( " 每列的最大值 "+summaryFlower.max ) println( " 每列的最小值 "+summaryFlower.min ) println( " 每列的L1范数 "+summaryFlower.normL1 ) println( " 每一列的欧几里得大小 欧几里德距离 "+summaryFlower.normL2 ) println( " 每列中非零元素的数目(包括显式显示的零值) "+summaryFlower.numNonzeros ) } }
包含每列平均值的稠密向量 [2.0,20.0,200.0] 列方差 [1.0,100.0,10000.0] 每列中的非零数 [3.0,3.0,3.0] 样本大小 150 样本均值向量 [5.843333333333332,3.0540000000000003,3.7586666666666666,1.1986666666666668] 样本方差向量。应该返回一个零向量,如果样本大小是1 [0.6856935123042509,0.18800402684563744,3.113179418344516,0.5824143176733783] 每列的最大值 [7.9,4.4,6.9,2.5] 每列的最小值 [4.3,2.0,1.0,0.1] 每列的L1范数 [876.4999999999998,458.1000000000001,563.8000000000002,179.79999999999995] 每一列的欧几里得大小 欧几里德距离 [72.27620631992245,37.77631533117014,50.82322303829225,17.38677658451963] 每列中非零元素的数目(包括显式显示的零值) [150.0,150.0,150.0,150.0]