numpy PCA前后数据的维数

0lvr5msh  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(123)

我尝试使用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的尺寸是多少?
组件的数量如何影响输出的维度?它们是一回事吗?

sbdsn5lh

sbdsn5lh1#

TL;DR:是,所需PCA分量的数量是输出数据的维度(转换后)。

PCA算法求出数据协方差矩阵的特征向量。什么是特征向量?没有人知道,也没有人关心(开玩笑!)。重要的是,第一个特征向量是一个平行于数据方差最大方向的向量(直观地说:第二个表示在最大扩展方面的第二最佳方向,以此类推。另一个重要的事实是,这些向量彼此正交,因此它们形成basis
pca_components参数告诉算法您感兴趣的 * 最佳 * 基向量有多少。因此,如果传递100,则意味着您希望获得描述以下内容的100基向量(统计学家会说:* 解释 *)数据的大部分方差。
transform函数将(srsly?;))从原始基到由所选PCA分量形成的基的数据(在本例中-第一个 * 最佳 * 100向量)。您可以将其可视化为旋转的点云,并忽略其某些维度。正如Jaime在注解中正确指出的,这相当于projecting the data到新基上。
对于3D的情况,如果你想得到一个由前2个特征向量组成的基,那么首先旋转3D点云,这样最大的方差就平行于坐标轴,然后,方差最小的轴被丢弃,剩下的是2D数据。

相关问题