我正在尝试kaggle.com's digit recognizer competition使用Python和scikit-learn .
从培训数据中删除标签后,我将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 回答
PCA算法找到数据的特征向量,重要的是第一个特征向量是平行于数据具有最大方差的方向的向量(直观地:扩展) . 第二个表示最大传播方面的第二个最佳方向,依此类推 . 另一个重要的事实是这些向量彼此正交,因此它们形成了一个basis .
pca_components
参数告诉算法您感兴趣的最佳基础向量是多少 . 因此,如果您传递100
,则意味着您希望获得描述(统计学家会说:解释)大部分数据方差的100
基础向量 .transform
函数将数据从原始基础转换为由所选PCA组件形成的基础(在此示例中为第一个最好的100
向量)(srsly?;)) . 您可以将其视为旋转点的 Cloud ,并忽略其某些维度 . 正如Jaime在评论中正确指出的那样,这相当于projecting the data在新的基础上 .对于3D情况,如果您想获得由第一个
2
特征向量构成的基础,则再次首先旋转3D点 Cloud ,因此最大方差将与坐标轴平行 . 然后,丢弃方差最小的轴,留下2D数据 .因此,直接回答您的问题:是的,所需PCA组件的数量是输出数据的维数(转换后) .