首页 文章

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

提问于
浏览
6

我正在尝试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 回答

  • 11

    PCA算法找到数据的特征向量,重要的是第一个特征向量是平行于数据具有最大方差的方向的向量(直观地:扩展) . 第二个表示最大传播方面的第二个最佳方向,依此类推 . 另一个重要的事实是这些向量彼此正交,因此它们形成了一个basis .

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

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

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

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

相关问题