理解scikit学习Python中的PCA.transform函数



所以我目前正在进行一个涉及主成分分析(PCA)的项目,我正试图在飞行中学习它。幸运的是,Python有一个来自scikitlearn.decomposition的非常方便的模块,它似乎可以为您完成大部分工作。不过,在我真正开始使用它之前,我正试图弄清楚它到底在做什么。

我一直在测试的数据帧看起来是这样的:

0  1
0  1  2
1  3  1
2  4  6
3  5  3

当我调用PCA.fit(),然后查看我得到的组件时:

array([[ 0.5172843 ,  0.85581362],
[ 0.85581362, -0.5172843 ]])

从我对PCA相当有限的知识来看,我有点了解这是如何计算的,但当我调用PCA.transform时,我会迷失方向。这是它给我的输出:

array([[-2.0197033 , -1.40829634],
[-1.84094831,  0.8206152 ],
[ 2.95540408, -0.9099927 ],
[ 0.90524753,  1.49767383]])

有人可能会告诉我它是如何将原始数据帧和组件转换为这个新数组的吗?我希望能够理解它正在进行的确切计算,这样当我放大时,我会更好地了解发生了什么。谢谢!

当您调用fit时,PCA将计算一些向量,您可以将数据投影到这些向量上,以降低数据的维度。由于数据的每一行都是二维的,因此数据最多可以投影到2个向量上,并且每个向量都是二维。PCA.components_的每一行都是一个单独的向量,事物被投影到这个向量上,它的大小与训练数据中的列数相同。由于你做了一个完整的PCA,你得到了2个这样的向量,所以你得到了一个2x2矩阵。这些向量中的第一个将使投影数据的方差最大化。第二个将最大化第一个投影后剩余的方差。通常情况下,一个传递的值n_components小于输入数据的维度,因此返回的行更少,并且components_数组宽但不高。

当你打电话给transform时,你要求sklearn实际进行投影。也就是说,您要求它将您的每一行数据投影到调用fit时学习的向量空间中。对于传递给transform的每一行数据,输出中将有一行,该行中的列数将是在fit阶段学习的向量数。换句话说,列数将等于传递给构造函数的n_components的值。

通常,当源数据有很多列,并且您希望在保留尽可能多的信息的同时减少列数时,使用PCA。假设您有一个包含100行的数据集,每行包含500列。如果你构建了一个类似PCA(n_components = 10)的PCA,然后称为fit,你会发现components_有10行,每个请求的组件一行,500列,因为这是输入维度。如果随后调用transform,则所有100行数据都将投影到这个10维空间中,因此输出将有100行(输入中每行1行),但只有10列,从而降低了数据的维度。

如何做到这一点的简单答案是,PCA计算奇异值分解,然后只保留其中一个矩阵的一些列。维基百科在这背后有更多关于实际线性代数的信息——StackOverflow的答案有点长。

相关内容

  • 没有找到相关文章

最新更新