数学基础之方差、标准差和协方差三者之间的定义与计算

匿名 (未验证) 提交于 2019-12-03 00:27:02

理解三者之间的区别与联系,要从定义入手,一步步来计算,同时也要互相比较理解,这样才够深刻。

方差

方差是各个数据与平均数之差的平方的平均数。在概率论和数理统计中,方差(英文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());获取皮尔曼和斯皮尔波系数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!