在向量上使用numpy.cov会产生NAN

时间:2012-12-10 21:22:16

标签: python numpy covariance

下午好。

我面临着一项PCA任务,它只涉及减少矢量的维数。在这种情况下,我对二维矩阵不感兴趣,但仅仅是一个D维向量,我想沿着它的K个主要特征向量投影。

为了实现PCA,我需要检索该向量的协方差矩阵。让我们尝试在示例向量上执行此操作:

someVec = np.array([[1.0, 1.0, 2.0, -1.0]])

我已将此向量定义为1 X 4矩阵,即行向量,以使其与numpy.cov兼容。通过numpy.cov获取此向量的协方差矩阵将产生标量协方差矩阵,因为numpy.cov假设特征在行中:

print np.cov(someVec)
1.58333333333

但这是(或者说应该)仅仅是维度假设的差异,并且采用转置向量的协方差应该可以正常工作,对吗?除了它没有:

print np.cov(someVec.T)
/usr/lib/python2.7/site-packages/numpy/lib/function_base.py:2005: RuntimeWarning:                  
invalid value encountered in divide
return (dot(X, X.T.conj()) / fact).squeeze()
[[ nan  nan  nan  nan]
[ nan  nan  nan  nan]
[ nan  nan  nan  nan]
[ nan  nan  nan  nan]]

我不确定我在这里做错了什么。有什么建议吗?

谢谢,

杰森

3 个答案:

答案 0 :(得分:5)

如果您想传入转置,则需要将rowvar设置为零。

In [10]: np.cov(someVec, rowvar=0)
Out[10]: array(1.5833333333333333)

In [11]: np.cov(someVec.T, rowvar=0)
Out[11]: array(1.5833333333333333)

来自docs

  

rowvar :int,可选

     

如果rowvar非零(默认),则每行   代表一个变量,在列中有观察结果。除此以外,   关系是转置的:每列代表一个变量,   行包含观察结果。

如果要查找完整的协方差矩阵,则需要多个观察值。通过单一观察和numpy的默认估算,NaN正是您所期望的。如果您希望N代替(N-1)进行规范化,则可以将1传递给偏见。

In [12]: np.cov(someVec.T, bias=1)
Out[12]:
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

再次,来自文档。

  

偏见:int,可选

     

默认归一化是(N-1),其中N是   给出的观察数量(无偏估计)。如果偏差为1,   然后归一化为N.这些值可以通过使用来覆盖   numpy版本中的关键字ddof> = 1.5。

答案 1 :(得分:0)

您应该使用numpy.cov中的选项row_var=0

In [1]: a = array([[1, 2, 3, 4]])

In [2]: np.cov(a)
Out[2]: array(1.6666666666666667)

In [3]: np.cov(a.T)
Out[3]: 
array([[ nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan]])

In [4]: np.cov(a.T, rowvar=0)
Out[4]: array(1.6666666666666667)

答案 2 :(得分:0)

  

不是真的,不应该返回尺寸为4 x 4的矩阵吗?我的意思是,矢量有4个“特征”,因此我想测量特征之间的方差并将它们存储在适当的位置,我需要一个协方差矩阵。

由于您只有一个观察值,因此无法计算协方差矩阵。根据估计量,协方差可以为零或未定义。

如果不直观,请尝试回答以下问题:

  1. 1.0的差异是什么?
  2. 1.02.0的协方差是什么?
  3. 从本质上讲,这些是您要求numpy.cov()执行的计算。