同步更新在个人网站:http://www.wangpengcufe.com/machinelearning/ml-ml3/
给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计。一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值、中位数、众数和四分位均值),展型(比如四分位间距、绝对偏差和绝对距离偏差、各阶矩等),统计离差,分布的形状,依赖性等。除此之外,spark.mllib库也提供了一些其他的基本的统计分析工具,包括相关性、分层抽样、假设检验,随机数生成等。
一、概括统计 summary statistics
我们通过统计学中提供的函数colStats为RDD [Vector]提供列摘要统计信息。我们可以获得每一列的最大值,最小值,均值、方差、总数。
我们用UCI 提供的莺尾花的数据来举例。 数据下载地址:http://archive.ics.uci.edu/ml/machine-learning-databases/iris/。我们将鸢尾花的四个属性,即萼片长度,萼片宽度,花瓣长度和花瓣宽度存储在observations中,类型为RDD[Vector]。
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.stat.MultivariateStatisticalSummary;
import org.apache.spark.mllib.stat.Statistics;
SparkConf conf = new SparkConf().setAppName("colStatsTest").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> source = sc.textFile("data/iris.data"); // 读取数据
JavaRDD<Vector> observations = source.map(line -> {
String[] parts = line.split(",");
return Vectors.dense(Double.valueOf(parts[0]), Double.valueOf(parts[1]),
Double.valueOf(parts[2]), Double.valueOf(parts[3]));//将RDD<String>转化为RDD<Vector>
});
MultivariateStatisticalSummary summary = Statistics.colStats(observations.rdd()); //计算列摘要统计信息。
System.out.println(summary.count()); //总数(long)
System.out.println(summary.mean()); // 包含每列平均值的密集向量(vector)
System.out.println(summary.variance()); // 列方差(vector)
System.out.println(summary.max()); // 最大值(vector)
System.out.println(summary.min()); // 最小值(vector)
System.out.println(summary.normL1()); //每列的L1范数(vector)
System.out.println(summary.normL2()); //每列的L2范数(vector)
System.out.println(summary.numNonzeros()); // 每列中的非零数(vector)
二、相关性
计算两个数据系列之间的相关性是统计学中的常见操作。 在spark.mllib中,我们提供了计算多个系列之间成对相关性的灵活性。 支持的相关方法目前是Pearson和Spearman的相关性。
相关系数是用以反映变量之间相关关系密切程度的统计指标。简单的来说就是相关系数绝对值越大(值越接近1或者-1),当取值为0表示不相关,取值为(0~-1]表示负相关,取值为(0, 1]表示正相关。
2.1、Pearson相关系数
Pearson相关系数表达的是两个数值变量的线性相关性, 它一般适用于正态分布。其取值范围是[-1, 1], 当取值为0表示不相关,取值为[-1~0)表示负相关,取值为(0, 1]表示正相关。
2.2、Spearman相关系数
Spearman相关系数也用来表达两个变量的相关性,但是它没有Pearson相关系数对变量的分布要求那么严格,另外Spearman相关系数可以更好地用于测度变量的排序关系。其计算公式为: