与博主有相同的感觉,方差,协方差,相关系数这三个概念都很常见,对方差和相关系数的理解还好,每次碰到协方差都好像是第一次见到一样,要查阅一下他的定义公式和意义,进行新一次的学习。
这几个概念已经有很多人总结分析过,但是总要自己亲自整理输出一次,才能加深理解。
方差
一个随机变量偏离中心的离散程度。公式:
协方差
两个随机变量协同偏离中心的离散程度。公式:
仅仅观察协方差的模值可能意义不大,因为并不知道协方差的大小是有哪个变量引起的,可能因为第一个变量的方差大,也可能第二个变量的方差大,也可能是因为两个变量的方差都大。
但是,协方差的符号可以反映出一些问题:这两个变量是正相关还是负相关。
如果协方差为正:说明两个变量倾向于向相同的方向偏离,都向大于均值的方向偏离,或者都向小于均值的方向偏离。
此时我们说两个变量正相关:一个变量变大时,另一个变量也倾向于变大;一个变量变小时,另一个变量也倾向于变小。
如果协方差为负:说明当一个变量向均值的正方向偏离时,另一个变量向均值的负方向偏离。或者反过来。
此时我们说两个变量负相关:当一个变量变大时,另一个变量倾向于变小;或一个变量变小时,另一个变量倾向于变大。
相关系数
协方差仅仅能判断两个变量的是正相关还是负相关,但是不能分析相关性的大小。
相关系数在协方差的基础之上定义,除了可以继承协方差,可以判断两个变量的是正相关还是负相关之外,还能分析相关性的大小。
相关系数为正:正相关
相关系数为负:负相关
相关系数模值越大,相关性越大。
协方差矩阵
以上提到的协方差是针对两个单独的变量来说的,当计算协方差的对象是两个矢量时,计算得到的协方差就张成了一个矩阵:第一个向量的第i个元素和第二个向量的第j个元素计算协方差,
对于协方差矩阵中的每个元素cov(i,j),如果为正,表示这两个变量正相关,否则负相关。
求一个矩阵的协方差矩阵:多数时候,求一个矩阵的协方差矩阵,实质是求向量的协方差矩阵:把矩阵的每一列看作一个向量样本,向量样本的每一个元素都是一个随机变量。计算得到的是向量的协方差矩阵。
numpy中的协方差计算
函数原型:def cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None)
参数:
- m: 待求协方差的一组样本,是一维数组或者二维数组。
是一维数组时,默认每个元素是一个样本
是二维数组时,默认每一列是一个样本,每一行代表一个变量。
- y: 与m具有一样的形式的一组数据
- rowvar:默认为True, 含义:row-var:每一行(row)代表一个变量(var),对应的,每一列代表一个样本。为False时,则反之
- bias:默认为False,体现在计算协方差的公式上
bias=False: 除以n-1;
bias = True :除以n。其中n为样本个数。
- ddof:类型是int,当其值非None时,bias参数作用将失效。
当ddof=1时,将会返回无偏估计(即除以n-1),既使指定了fweights和aweights参数;
当ddof=0时,则返回简单平均值(即除以n)。
- frequency weights: 一维数组,代表在计算协方差时,每个样本被使用的次数(相当于给样本赋予权重)
- analytic weights:(未确定)一维数组,代表观测矢量权重。对于被认为“重要”的观察,这些相对权重通常很大,而对于被认为不太重要的观察,这些相对权重较小。如果ddof = 0,则可以使用权重数组将概率分配给观测向量。
返回:
协方差标量或矩阵
应用示例:
import numpy as np
data = [[ 0.80, 0.55, 0.22, 0.03],
[ 0.82, 0.50, 0.23, 0.03],
[ 0.80, 0.54, 0.22, 0.03],
[ 0.80, 0.53, 0.26, 0.03],
[ 0.79, 0.56, 0.22, 0.03],
[ 0.75, 0.60, 0.25, 0.03],
[ 0.77, 0.59, 0.22, 0.03]]
data = np.transpose(data) # 7个样本,每个样本是个4维矢量。
cov_ = np.cov(m=data, rowvar=True,fweights=[1,1,1,1,1,1,1]) # 每个样本的使用频次都是1
print(data.shape)
print(cov_.shape)
"""
(4, 7)
(4, 4)
"""