下午好。
我面临着一项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]]
我不确定我在这里做错了什么。有什么建议吗?
谢谢,
杰森
答案 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.0
的差异是什么?1.0
和2.0
的协方差是什么?从本质上讲,这些是您要求numpy.cov()
执行的计算。