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

时间:2013-11-15 12:50:11

标签: python numpy scikit-learn pca

我正在尝试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_dataX_train的维度是什么?

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

1 个答案:

答案 0 :(得分:11)

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

pca_components参数告诉算法您感兴趣的最佳基础向量有多少。因此,如果您通过100,则表示您希望得到100基本向量描述(统计学家会说:解释)大部分数据的方差。

transform函数将数据从原始基础转换为由所选PCA组件形成的基础(在此示例中 - 第一个最佳 {{1矢量)。您可以将其视为旋转点的云,并忽略其某些维度。正如评论中Jaime正确指出的那样,这相当于新projecting the data

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

所以,直接回答你的问题:是的,所需PCA组件的数量是输出数据的维数(转换后)。