1

下午好。

我面临着一项 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]]

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

谢谢,

杰森

4

3 回答 3

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)

文档

rowvar:int,可选

如果 rowvar 不为零(默认),则每一行代表一个变量,列中包含观察值。否则,关系被转置:每列代表一个变量,而行包含观察值。

如果你想找到一个完整的协方差矩阵,你需要不止一个观察值。通过一次观察和 numpy 的默认估算器,NaN这正是您所期望的。如果您希望通过N代替 进行标准化(N-1),您可以将 a 传递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 版本 >= 1.5 中使用关键字 ddof 来覆盖。

于 2012-12-10T21:31:14.690 回答
0

You should use the option row_var=0 in numpy.cov:

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)
于 2012-12-10T21:33:44.333 回答
0

不是真的,那不应该返回一个大小为 4 x 4 的矩阵吗?我的意思是,向量有 4 个“特征”,所以考虑到我想测量特征之间的方差并将它们存储在适当的位置,我需要一个协方差矩阵。

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

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

  1. 的方差是1.0多少?
  2. 1.0和的协方差是2.0多少?

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

于 2012-12-10T21:41:15.603 回答