我正在尝试使用Python和scikit-learn进行kaggle.com的数字识别器竞赛。
从训练数据中删除标签后,我将 CSV 中的每一行添加到如下所示的列表中:
for row in csv:
train_data.append(np.array(np.int64(row)))
我对测试数据做同样的事情。
我用PCA预处理这些数据,以便执行降维(和特征提取?
def preprocess(train_data, test_data, pca_components=100):
# convert to matrix
train_data = np.mat(train_data)
# reduce both train and test data
pca = decomposition.PCA(n_components=pca_components).fit(train_data)
X_train = pca.transform(train_data)
X_test = pca.transform(test_data)
return (X_train, X_test)
然后,我创建一个 kNN 分类器并将其与X_train
数据拟合,并使用X_test
数据进行预测。
使用这种方法,我可以获得大约 97% 的准确率。
我的问题是关于执行 PCA 之前和之后的数据维度
train_data
和X_train
的尺寸是多少?
分量的数量如何影响输出的维数?它们是一回事吗?
TL;DR:是的,所需PCA分量的数量是输出数据的维度(转换后)。
PCA 算法查找数据协方差矩阵的特征向量。什么是特征向量?没有人知道,也没有人在乎(开个玩笑!重要的是,第一个特征向量是平行于数据具有最大方差的方向(直观地说:扩散)的向量。第二个表示最大点差方面的第二最佳方向,依此类推。另一个重要的事实是,这些向量彼此正交,因此它们构成了一个基础。
pca_components
参数告诉算法您对多少个最佳基向量感兴趣。因此,如果您传递100
则意味着您希望获得描述(统计学家会说:解释)数据大部分方差的100
基向量。
transform
函数将数据从原始基转换(srsly?;))到由所选PCA分量形成的基础(在本例中 - 第一个最佳100
向量)。您可以将其可视化为正在旋转并忽略其某些尺寸的点云。正如Jaime在评论中正确指出的那样,这相当于将数据投影到新的基础上。
对于 3D 情况,如果要获得由前 2
个特征向量形成的基础,那么同样,3D 点云将首先旋转,因此最大方差将平行于坐标轴。然后,方差最小的轴将被丢弃,留下 2D 数据。