【问题标题】:Dimension of data before and after performing PCA执行 PCA 前后的数据维度
【发布时间】:2013-11-28 20:55:04
【问题描述】:

我正在尝试使用 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_dataX_train的尺寸是多少?

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

【问题讨论】:

    标签: python numpy scikit-learn pca


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 2015-10-27
      • 2021-12-10
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      相关资源
      最近更新 更多