执行PCA之前和之后的数据维度

jmz*_*jmz 6 python numpy pca scikit-learn

我正在尝试使用Python和scikit-learn 进行kaggle.com的数字识别器竞赛.

从训练数据中删除标签后,我将CSV中的每一行添加到如下列表中:

for row in csv:
    train_data.append(np.array(np.int64(row)))
Run Code Online (Sandbox Code Playgroud)

我对测试数据做了同样的事情.

我使用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)
Run Code Online (Sandbox Code Playgroud)

然后我创建一个kNN分类器并将其与X_train数据拟合并使用数据进行预测X_test.

使用这种方法,我可以获得97%的准确率.

我的问题是关于PCA执行前后数据的维度

什么尺寸train_dataX_train

组件数量如何影响输出的维数?它们是一样的吗?

Bar*_*zKP 11

PCA算法找到数据的协方差矩阵的特征向量.什么是特征向量?没有人知道,也没有人关心(只是在开玩笑!).重要的是第一个特征向量是一个平行于数据具有最大方差的方向的矢量(直观地:展开).第二个表示最大传播方面的第二个最佳方向,依此类推.另一个重要的事实是这些矢量彼此正交,因此它们构成了基础.

pca_components参数告诉算法您感兴趣的最佳基础向量是多少.因此,如果您通过100它意味着您希望获得100描述(统计学家会说:解释)数据的大部分方差的基础向量.

transform函数将数据从原始基础转换为由所选PCA组件形成的基础(在此示例中为第一个最佳 100向量)(srsly?;)).您可以将其视为旋转点的云,并忽略其某些维度.正如Jaime在评论中正确指出的那样,这相当于将数据投射到新的基础上.

对于3D情况,如果您想获得由第一个2特征向量构成的基础,那么再次,3D点云将首先旋转,因此最大方差将与坐标轴平行.然后,丢弃方差最小的轴,留下2D数据.

因此,直接回答您的问题:是的,所需PCA组件的数量是输出数据的维数(转换后).