理解三者之间的区别与联系,要从定义入手,一步步来计算,同时也要互相比较理解,这样才够深刻。
方差
方差是各个数据与平均数之差的平方的平均数。在概率论和数理统计中,方差(英文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());获取皮尔曼和斯皮尔波系数