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

在PCA中涉及到了方差var和协方差cov,这里简单总结下。
首先:均值,样本方差,样本协方差的公式为

均值: X¯=1NNi=1Xi

方差: var=1NNi=1(XiX¯)2

样本方差: S=1N1Ni=1(XiX¯)2

样本协方差: cov=1N1Ni=1(XiX¯)(YiY¯)

首先我们应该清楚的区分两个概念,即方差和样本方差的无偏估计:
方差公式中分母上是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 <script id="MathJax-Element-286" type="math/tex">s</script>那样除以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。

先到这里。。。

  • 22
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值