理解三者之间的区别与联系,要从定义入手,一步步来计算,同时也要互相比较理解,这样才够深刻。
方差
方差是各个数据与平均数之差的平方的平均数。在概率论和数理统计中,方差(英文Variance)用来度量随机变量和其数学期望(即均值)之间的偏离程度。在许多实际问题中,研究随机变量和均值之间的偏离程度有着很重要的意义。
标准差
方差开根号。
协方差
在概率论和统计学中,协方差用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
可以通俗的理解为:两个变量在变化过程中是否同向变化?还是反方向变化?同向或反向程度如何?
你变大,同时我也变大,说明两个变量是同向变化的,这是协方差就是正的。
你变大,同时我变小,说明两个变量是反向变化的,这时协方差就是负的。
如果我是自然人,而你是太阳,那么两者没有相关关系,这时协方差是0。
从数值来看,协方差的数值越大,两个变量同向程度也就越大,反之亦然。
可以看出来,协方差代表了两个变量之间的是否同时偏离均值,和偏离的方向是相同还是相反。
公式:如果有X,Y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”得到一个乘积,再对这每时刻的乘积求和并求出均值,即为协方差。
方差,标准差与协方差之间的联系与区别:
1. 方差和标准差都是对一组(一维)数据进行统计的,反映的是一维数组的离散程度;而协方差是对2组数据进行统计的,反映的是2组数据之间的相关性。
2. 标准差和均值的量纲(单位)是一致的,在描述一个波动范围时标准差比方差更方便。比如一个班男生的平均身高是170cm,标准差是10cm,那么方差就是10cm^2。可以进行的比较简便的描述是本班男生身高分布是170±10cm,方差就无法做到这点。
3. 方差可以看成是协方差的一种特殊情况,即2组数据完全相同。
4. 协方差只表示线性相关的方向,取值正无穷到负无穷。
利用实例来计算方差、标准差和协方差
样本数据1:沪深300指数2017年3月份的涨跌额(%), [0.16,-0.67,-0.21,0.54,0.22,-0.15,-0.63,0.03,0.88,-0.04,0.20,0.52,-1.03,0.11,0.49,-0.47,0.35,0.80,-0.33,-0.24,-0.13,-0.82,0.56]
package com.lilei.mllib.tongji; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.Function; 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; import java.util.ArrayList; import java.util.List; public class TongJiTest1 { public static void main(String[] args) { String path = "E:\\testdata\\sparkdata\\mllib2.txt"; SparkConf sparkConf = new SparkConf() .setAppName("mllibTest").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(sparkConf); JavaRDD<String> rdd = sc.textFile(path); JavaRDD<List<Double>> mapRDD = rdd.map( new Function<String, List<Double>>() { @Override public List<Double> call(String v1) throws Exception { ArrayList<Double> doubles = new ArrayList<>(); String[] split = v1.split(","); for (String str : split){ doubles.add(Double.parseDouble(str)); } return doubles; } } ); JavaRDD<Vector> map = mapRDD.map( new Function<List<Double>, Vector>() { @Override public Vector call(List<Double> v1) throws Exception { double[] doubles = new double[v1.size()]; for (int i = 0; i < v1.size(); i++){ doubles[i] = v1.get(i); } Vector dense = Vectors.dense(doubles); return dense; } } ); MultivariateStatisticalSummary summary = Statistics.colStats(map.rdd()); System.out.println(summary.mean()); // 平均值 System.out.println(summary.variance()); // 方差值 System.out.println(summary.numNonzeros()); // 总共有多少列 System.out.println(summary.max()); //最大值 System.out.println(summary.min()); //最小值 System.out.println(summary.normL1());//L1范式 System.out.println(summary.normL2());//L2范式 } }
结果:
注意:java只能每一列的去计算方差,协方差...这些数据,目前没找到一行的计算方法,可以Matrix corr = Statistics.corr(map.rdd());获取皮尔曼和斯皮尔波系数