在向量上使用numpy.cov可以生成NAN



下午好。

我面临着一个PCA任务,它只涉及降低向量的维度。在这种情况下,我对二维矩阵不感兴趣,而只是一个D维向量,我想沿着它的K个主特征向量投影它。

为了实现PCA,我需要检索该向量的协方差矩阵。让我们试着在一个示例向量上这样做:

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

我已经将这个向量定义为1 X 4矩阵,即行向量,以使其与numpy.cov兼容。通过numpy.cove获取这个向量的协方差矩阵将产生标量协方差矩阵,因为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]]

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

谢谢,

Jason

如果要传递转置,则需要将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)

来自文档:

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,可选

默认规范化为by(N-1),其中N为给出的观测次数(无偏估计)。如果偏置为1,则归一化为N。这些值可以通过使用numpy版本>=1.5中的关键字ddof。

您应该在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)

不是真的,这不是应该返回一个大小为4 x 4的矩阵吗?我的意思是,向量有4个"特征",所以如果我想测量特征之间的方差并将它们存储在适当的地方,我需要一个协方差矩阵。

由于只有一个观测值,因此无法计算协方差矩阵。根据估计器的不同,协变可能为零或未定义。

如果直觉上不清楚,试着回答以下问题:

  1. 1.0的方差是多少
  2. 1.02.0的协方差是多少

本质上,这些是您要求numpy.cov()执行的计算。

最新更新