December 17, 2018

使用Python计算方差协方差相关系数

使用Python计算方差,协方差和相关系数

[TOC]

数学定义

期望

设随机变量$X$只取有限个可能值$a_i (i=0, 1, …, m)$,其概率分布为$P (X = a_i) = p_i$. 则$X$的数学期望,记为$E(X)$或$EX$,定义为:

$$E(X) = \sum\limits_ia_ip_i$$

方差

设$X$为随机变量,分布为$F$,则

$$Var(X) = E(X-EX)^2 $$

称为$X$(或分布$F$)的方差,其平方根$\sqrt{Var(X)}$称为$X$(或分布$F$)的标准差.

方差和标准差是刻画随机变量在其中心位置附近散布程度的数字特征。

注意:样本方差和总体方差的区别

统计学上对于样本方差的无偏估计使用如下公式计算:

$$s^2 = \frac{1}{n-1} \sum\limits_{i=1}^n(x_i -\bar{x})^2 $$

前面有一个系数$\frac{1}{n-1}$,当时当样本数量很大的时候,$\frac{n}{n-1}$近似为1,可以直接使用总体方差公式进行计算。

协方差

协方差用来刻画两个随机变量$X, Y$之间的相关性,定义为

$$Cov(X, Y) = E[(X - EX)(Y-EY)]$$

如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;如果协方差为负,说明X,Y反向运动,协方差越小说明反向程度越高

相关系数

相关系数可以理解为标准化以后的协方差,设$X$的标准差为$\sigma_x$,$Y$的标准差为$\sigma_y$定义为

$$\rho = \frac{Cov(X, Y)}{\sigma_x\sigma_y}$$

相关系数消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度

协方差矩阵

协方差只能表示两个随机变量的相关程度(二维问题),对于大于二维的随机变量,可以使用协方差矩阵表示.

协方差矩阵的每一个值就是对应下标的两个随机变量的协方差

对于三维协方差矩阵,$C=\begin{bmatrix}Cov(X, X) & Cov(X, Y) & Cov(X, Z) \ Cov(Y, X) & Cov(Y, Y) & Cov(X, Y) \ Cov(Z, X) & Cov(Z, Y) & Cov(Z, Z)\end{bmatrix}$

使用NumPy包计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np

# 随机生成两个样本
x = np.random.randint(0, 9, 1000)
y = np.random.randint(0, 9, 1000)

# 计算平均值
mx = x.mean()
my = y.mean()

# 计算标准差
stdx = x.std()
stdy = y.std()

# 计算协方差矩阵
covxy = np.cov(x, y)
print(covxy)

# 我们可以手动进行验证
# covx等于covxy[0, 0], covy等于covxy[1, 1]
# 我们这里的计算结果应该是约等于,因为我们在计算的时候是使用的总体方差(总体方差和样本方差是稍微有点区别的)
covx = np.mean((x - x.mean()) ** 2)
covy = np.mean((y - y.mean()) ** 2)
print(covx)
print(covy)
# 这里计算的covxy等于上面的covxy[0, 1]和covxy[1, 0],三者相等
covxy = np.mean((x - x.mean()) * (y - y.mean()))
print(covxy)

# 下面计算的是相关系数矩阵(和上面的协方差矩阵是类似的)
coefxy = np.corrcoef(x, y)
print(coefxy)

一组可能的输出结果:

1
2
3
4
5
6
7
[[6.83907508 0.10925926]
[0.10925926 6.53390891]]
6.832236
6.527375
0.10914999999999989
[[1. 0.01634455]
[0.01634455 1. ]]