我现在正在学习子空间方法来对手写数字进行分类。
子空间方法需要一个自相关矩阵,我发现np.corrcoef()
可以计算出来。
在np.corrcoef()
的文档中,默认情况下说“每一行代表一个变量,列中带有观察值”。因此,我转置了输入数据,因为每一行都是一个观察值(4132 obs,784 vars)。
但是,该函数通过转置返回一个包含info或NaNs的数组。然后,我无法计算特征值和特征向量。
不进行转置,我可以完美地进行计算,但这不是我想要的((4132、4132)形状数组)。我不明白为什么会这样。
这是我的代码:
X = train[train["label"]==i].iloc[:,1:]
C = np.corrcoef(X.T)
print(np.isnan(np.min(C))) #-> print True if there are Nan values
eig_val,eig_vec = linalg.eigh(C) #-> returns ValueError
print(eig_val.shape,eig_vec.shape)
X就是这样(4132行,785列)
答案 0 :(得分:0)
问题在于,某些行(在转置后)没有方差,因此协方差矩阵中存在零值(可以使用np.cov
进行检查)。如果您检查文档中的np.corrcoef
,则相关系数会被协方差矩阵中的元素除,因此除以0 ,因为您的某些行没有方差。