对于一个随机变量的分布特征,可以由均值、方差、标准差等进行描述。而对于两个随机变量的情况,有协方差和相关系数来描述两个随机变量的相互关系。

本文主要参考概率论与数理统计的教科书,整理了协方差、样本协方差、协方差矩阵、相关系数的概念解释和代码。

协方差(covariance)

协方差的概念来自概率论,实际应用中的样本协方差则与统计学概念有关。

协方差反应了随机变量pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python之间“协同”变化的关系。也可以说,协方差在某种意义上给出了两个变量线性相关性的强度以及这些变量的尺度。

pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_02就是pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_机器学习_03时,pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python_04协方差即为方差,这就是我们称其为协方差的原因。1

协方差定义:
pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python_05

直观解释

pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_06,即事件pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_统计学_07pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_08发生的可能性更大,说明pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_机器学习_03pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_02均有同时大于或同时小于各自平均值的趋势。

协方差的绝对值如果很大,则意味着变量值变化很大,并且它们同时距离各自的均值很远。

如果协方差是正的,那么两个变量都倾向于同时取得相对较大的值。如果协方差是负的,那么其中一个变量倾向于取得相对较大的值的同时,另一个变量倾向于取得相对较小的值,反之亦然。

样本协方差(sample covariance)

实际应用中,总体pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_机器学习_03的均值pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_12、方差pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_13均未知,pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python_14为取自该总体的一个样本,则样本均值pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python_15pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_12的无偏估计量,样本方差pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_统计学_17pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_13的无偏估计量。

同理,总体pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python的协方差也是一个未知参数,而样本协方差是基于数据得到的估计量。样本协方差是总体协方差的无偏估计。

样本协方差可以用下式计算:
pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python_20
样本方差、样本协方差的分母是n-1而不是n的解释和数学推导可以看下这篇文章

协方差矩阵(covariance matrix)

随机向量pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_21的协方差矩阵是一个pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_22的矩阵,并且满足:
pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_统计学_23
协方差矩阵的对角元是方差:
pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_24

代码示例

基于numpy的cov函数2,可以得到协方差矩阵:

import numpy as np
x1 = [-2.1, -1,  4.3]
x2 = [3,  1.1,  0.12]

X = np.stack((x1, x2), axis=0)# 每一行作为一个变量
np.cov(X)
#[out]:array([[11.71      , -4.286     ], 
#       	  [-4.286     ,  2.144133]])
np.cov(x1, x2)
#[out]:array([[11.71      , -4.286     ], 
#       	  [-4.286     ,  2.144133]])
np.cov(x1)
#[out]:array(11.71)

或者用公式计算:

def de_mean(x):
    xmean = np.mean(x)
    return [xi - xmean for xi in x]

def covariance(x, y):
    n = len(x)
    return np.dot(de_mean(x), de_mean(y)) / (n-1)

covariance(x1,x2)
#[out]: -4.2860000000000005

相关系数(Pearson Correlation Coefficient)

协方差可以描述随机变量之间协同变化的关系,但在使用中存在这样一个问题:例如,要讨论新生婴儿的身高X和体重Y的协方差,若采用两种不同的单位,米和千克或者厘米和克,后者协方差是前者的100000倍!由于量纲的不同导致X与Y的协方差前后不同。

为避免这样的情形发生,将随机变量标准化,pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_25,再求协方差pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_协方差_26,这就是随机变量X和Y的相关系数,又称为标准化协方差。1

这是统计学家Pearson提出的用于统计两个随机变量之间线性相关程度的统计量,也叫皮尔逊相关系数(Pearson Correlation Coefficient)

随机变量pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_机器学习_03pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_02的相关系数:
pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_29

设二维随机变量 (X,Y) 的相关系数pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_30存在,则:

  • pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_python_31时,(X,Y)的取值(x,y)在直线y=ax+b上的概率为1,称X与Y完全线性相关;
  • pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_32>0时,称X与Y正线性相关;
  • pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_概率论_32<0时,称X与Y负线性相关。

直观解释

与协方差相比,相关系数(correlation)将每个变量的贡献归一化,为了只衡量变量的相关性而不受各个变量尺度大小的影响。

代码实现

对于矩阵a,numpy.corrcoef(a)可计算行与行之间的相关系数,行为一个随机变量,列为其观测值,输出为相关系数矩阵。3

import numpy as np
x1 = [-2.1, -1,  4.3]
x2 = [3,  1.1,  0.12]

X = np.stack((x1, x2), axis=0)# 每一行作为一个变量
np.corrcoef(X)
#[out]: array([[ 1.        , -0.85535781],
      		   [-0.85535781,  1.        ]])

除了numpy的函数,pandas对象也装配了常用的数学、统计学方法。这些方法从DataFrame的行或列中抽取一个Series或一系列值的单个值(如总和或平均值)。与NumPy数组中的类似方法相比,它们内建了处理缺失值的功能。4

pandas中Seriescorr方法计算的是两个Series中重叠的、非NA的、按索引对齐的值的相关性。cov计算的是协方差。

pandas中DataFramecorrcov方法会分别以DataFrame的形式返回相关性和协方差矩阵。5

import pandas as pd

df = pd.DataFrame([(.2, .3), (.0, .6), (.6, .0), (.2, .1)],
                  columns=['dogs', 'cats'])
                  
"""
计算相关系数,支持三种方法
pearson : standard correlation coefficient
kendall : Kendall Tau correlation coefficient
spearman : Spearman rank correlation
"""
df.corr(method='pearson')

"""
计算协方差矩阵
"""
df.cov()

输出:

pytorch两个特征矩阵怎么计算协方差矩阵 python协方差矩阵_机器学习_34


  1. 《概率论与数理统计》 ↩︎ ↩︎
  2. https://numpy.org/doc/stable/reference/generated/numpy.cov.html ↩︎
  3. https://zhuanlan.zhihu.com/p/35122515 ↩︎
  4. 《利用python进行数据分析》 ↩︎
  5. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html ↩︎