我尝试使用Python和scikit-learn来实现kaggle.com's digit recognizer competition。
从训练数据中删除标签后,我将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
的尺寸是多少?
组件的数量如何影响输出的维度?它们是一回事吗?
1条答案
按热度按时间sbdsn5lh1#
TL;DR:是,所需PCA分量的数量是输出数据的维度(转换后)。
PCA算法求出数据协方差矩阵的特征向量。什么是特征向量?没有人知道,也没有人关心(开玩笑!)。重要的是,第一个特征向量是一个平行于数据方差最大方向的向量(直观地说:第二个表示在最大扩展方面的第二最佳方向,以此类推。另一个重要的事实是,这些向量彼此正交,因此它们形成basis。
pca_components
参数告诉算法您感兴趣的 * 最佳 * 基向量有多少。因此,如果传递100
,则意味着您希望获得描述以下内容的100
基向量(统计学家会说:* 解释 *)数据的大部分方差。transform
函数将(srsly?;))从原始基到由所选PCA分量形成的基的数据(在本例中-第一个 * 最佳 *100
向量)。您可以将其可视化为旋转的点云,并忽略其某些维度。正如Jaime在注解中正确指出的,这相当于projecting the data到新基上。对于3D的情况,如果你想得到一个由前
2
个特征向量组成的基,那么首先旋转3D点云,这样最大的方差就平行于坐标轴,然后,方差最小的轴被丢弃,剩下的是2D数据。