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

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

方差

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

猜你喜欢

转载自blog.csdn.net/u013164612/article/details/80692569