您的位置:首页 > 编程语言 > Python开发

numpy.cov()和numpy.var()的用法

2017-10-31 09:21 239 查看
在PCA中涉及到了方差var和协方差cov,这里简单总结下。

首先:均值,样本方差,样本协方差的公式为

均值:X¯=1N∑Ni=1Xi

方差:var=1N∑Ni=1(Xi−X¯)2

样本方差:S=1N−1∑Ni=1(Xi−X¯)2

样本协方差:cov=1N−1∑Ni=1(Xi−X¯)(Yi−Y¯)

首先我们应该清楚的区分两个概念,即方差和样本方差的无偏估计:

方差公式中分母上是N;样本方差无偏估计公式中分母上是N-1 (N为样本个数)。

其中样本方差公式中为什么除的n-1而不是n?样本协方差同样除的是n-1而不是n?如果除的是n,那么求的方差就不是随机抽取变量组成样本的方差,而是整个空间的方差。

1. 求协方差

协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。理解协方差矩阵的关键就在于牢记它计算的是不同维度之间的协方差,而不是不同样本之间,拿到一个样本矩阵,我们最先要明确的就是一行是一个样本还是一个维度。

例1.1

>>> X=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]])
>>> np.cov(X)
array([[  7.  ,   4.5    ,       4.   ,   -0.5     ],
[  4.5 ,  10.33333333,   11.5  ,  -7.16666667],
[  4.  ,  11.5     ,      13.  ,   -8.5      ],
[ -0.5 ,  -7.16666667,   -8.5  ,  6.33333333]])


在numpy中,将x的每一列视作一个独立的变量,因此这里一共有3个4维的变量,因此将会输出一个4*4的协方差矩阵 ,其中对角线元素是每个维度的方差,非对角线上的元素则是不同维度间的协方差。

例1.2 下面是一个协方差实现的另一个简单例子:

>>> import numpy as np
>>> x = np.array([[0, 2], [1, 1], [2, 0]]).T
>>> x
array([[0, 1, 2],
[2, 1, 0]])
>>> np.cov(x)  # 两个变量x0和x1,有很大的相关性,但是相反的方向
array([[ 1., -1.],
[-1.,  1.]])
>>> x = [-2.1, -1,  4.3]
>>> y = [3,  1.1,  0.12]
>>> X = np.vstack((x,y))
>>> X
array([[-2.1 , -1.  ,  4.3 ],
[ 3.  ,  1.1 ,  0.12]])
>>> np.cov(X)
array([[ 11.71      ,  -4.286     ],
[ -4.286     ,   2.14413333]])
>>> np.cov(x, y)
array([[ 11.71      ,  -4.286     ],
[ -4.286     ,   2.14413333]])
>>> np.cov(x)
array(11.709999999999999)


1.3 numpy中cov(x)与cover(x,y)的区别

示例:

>>> X=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]])
>>> X
array([[1, 5, 6],
[4, 3, 9],
[4, 2, 9],
[4, 7, 2]])
>>> x=X[0:2]
>>> y=X[2:4]
>>> np.cov(X)
array([[  7. ,   4.5   ,       4.  ,    -0.5    ],
[  4.5,  10.33333333,  11.5 ,  -7.16666667],
[  4. ,  11.5       ,  13.  ,  -8.5       ],
[ -0.5,  -7.16666667,  -8.5 ,  6.33333333]])
>>> np.cov(x,y)
array([[  7.  ,   4.5     ,    4.  ,   -0.5      ],
[  4.5 ,  10.33333333,  11.5 ,  -7.16666667],
[  4.  ,  11.5       ,  13.  ,  -8.5       ],
[ -0.5 ,  -7.16666667,  -8.5 ,   6.33333333]])
>>>


可以看出两者的输出是相同的。因此np.cov(X)其实就是把np.cov(x,y)中两个变量所有的维度纵向拼接在一起作为X参与运算。

2.由协方差矩阵求其相关的矩阵:

假设协方差矩阵sigma

>>> sigma=np.array([[4,1,2],[2,3,4],[2,3,5]])
>>> sigma
array([[4, 1, 2],
[2, 3, 4],
[2, 3, 5]])
>>> p=len(sigma)  # 得出协方差的长度
>>> p
3
>>> e=np.eye(p)
>>> e
array([[ 1.,  0.,  0.],
[ 0.,  1.,  0.],
[ 0.,  0.,  1.]])
>>> variance=e*sigma  # 得出协方差矩阵的对角线元素,即方差矩阵
>>> variance
array([[ 4.,  0.,  0.],
[ 0.,  3.,  0.],
[ 0.,  0.,  5.]])
>>> v=np.power(variance,0.5) # 得出标准差矩阵
>>> v
array([[ 2.        ,  0.        ,  0.        ],
[ 0.        ,  1.73205081,  0.        ],
[ 0.        ,  0.        ,  2.23606798]])
>>> I=np.linalg.inv(v)  # 得出标准差的逆矩阵
>>> I
array([[ 0.5       ,  0.        ,  0.        ],
[ 0.        ,  0.57735027,  0.        ],
[ 0.        ,  0.        ,  0.4472136 ]])
>>> cov=I.dot(sigma).dot(I) # 得出相关系数矩阵
>>> cov
array([[ 1.        ,  0.28867513,  0.4472136 ],
[ 0.57735027,  1.        ,  1.03279556],
[ 0.4472136 ,  0.77459667,  1.        ]])
>>>


其中对角线元素是每个维度的方差,非对角线上的元素则是不同维度间的协方差

3. 计算矩阵的方差

在数学中,每一维度指的是列,例如:[1,2,3]维度是三维的,但是在array中,每一维度指的是一个array,也就是一个样本。

计算方差的公式为:

>>> a=np.array([1,2,7])
>>> a
array([1, 2, 7])
>>> a.var()
6.8888888888888884
>>>


这里计算的方差不是如方差公式s那样除以N-1,在numpy里是上述的var。

4. 在matlab中的使用

4.1 matlab 统计基本函数 var方差

参考:(http://blog.csdn.net/tong_huijiao/article/details/54018019

函数名称: var

函数功能:求解方差

函数用法:

var(X) 【与var(X,0)相同 】

var(X,W)

var(X,W,dim)

注:var(X,W)

W可以取0或1:取0求样本方差的无偏估计值(除以N-1),对应取1求得的是方差(除以N)

W也可以是向量,但必须与X中的第一个维度数相同,即length(W)= size(X,1)

var(X ,0 ,dim) :除以N-1 ;dim =1 对每列操作 dim = 2 对每行操作

var(X ,1 ,dim) : 除以N ;dim =1 对每列操作 dim = 2 对每行操作

var(X,W,dim) : 关于W取向量时,把W看做X中观察值发生的次数(或者说概率也行)

1.对于X是向量时:把向量中每个元素看做一个样本

var(X) 或者 var(x,0)函数输出这个向量中元素的样本方差的无偏估计值,var(x,1)输出的是样本方差 。

2. 对于X是矩阵时

把每行看做一个观察值,每列看做一个变量,函数输出一个行向量,每个元素计算的是该列的方差

3. 对于var(X ,0 ,dim) 或者 var(X ,1 ,dim)

前面已说 0 对应 除以N-1; 1对应除以N

dim 指维度信息,默认为1,dim =1 就指对每列操作; dim =2 就指对每行操作。

4 . 对于 var(X,W)、var(X,W,dim) 中W为向量的情况:

把W看做X中对应观察值发生的次数(或者说概率也行)处理

4.2 MATLAB中cov函数的用法

参考:(http://blog.sina.com.cn/s/blog_9e67285801010twv.html)

函数名称:cov

函数功能:求协方差矩阵

函数用法:

cov(X) :cov(X,0) = cov(X)

cov(X,Y) :X,Y必须是各维数都相同的矩阵

cov(X,1) :除以N而不是N-1

cov(X,Y,1) : 除以N而不是N-1

1.如果X是向量

cov(X)输出的是这个向量的方差

2. X是一个矩阵来

matlab把每行看做一个观察值,把每列当做一个变量.也就是说对于一个4*3的矩阵求协方差矩阵,matlab会认为存在三个变量,即会求出一个3*3的协方差矩阵。其中,对角线元素为对应变量的方差无偏估计值,其他位置为对应变量间的协方差无偏估计值(即除的是N-1)

3.对于cov(X,Y)

X、Y必须是各维数都相等的矩阵,其功能是把X中所有元素看做一个变量的样本,Y中所有元素看做另外一个变量的样本,把矩阵中每个对应位置看做一个联合观察值,函数实现的是求出两个变量的协方差矩阵。

4. cov(X,1) 和 cov(X,Y,1)

与之前的求解过程一致。不同的是,其求出的是协方差,而不是样本的协方差无偏估计值,即其除以的是N 而不是N-1。

先到这里。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: