下午好。
我面临着一个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.0
的方差是多少1.0
和2.0
的协方差是多少
本质上,这些是您要求numpy.cov()
执行的计算。