了解Python中的scikitlearn PCA.transform函数 - python

因此,我目前正在从事一个涉及使用主成分分析(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]])

有人可能会引导我了解如何将原始数据帧和组件转换为新数组吗?我希望能够了解它所做的确切计算,以便在扩展时可以更好地了解正在发生的事情。谢谢!

参考方案

当您进行拟合时,PCA将计算一些向量,您可以将向量投影到这些向量上,以减小数据的维数。由于数据的每一行都是二维的,因此最多可以将2个向量投影到数据上,并且每个向量都是二维的。 PCA.components_的每一行都是一个向量,可以将事物投影到该向量上,并且其大小与训练数据中的列数相同。由于您执行了完整的PCA,因此您将获得2个这样的向量,因此您将获得2x2矩阵。这些向量中的第一个向量将最大化投影数据的方差。第二个将最大化第一个投影后剩余的方差。通常,传递的值n_components小于输入数据的维数,这样您可以返回较少的行,并且具有宽但不高的components_数组。

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

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

这样做的简短答案是PCA计算奇异值分解,然后仅保留其中一个矩阵的某些列。 Wikipedia后面有更多关于实际线性代数的信息-一个StackOverflow答案有点长。

使用sklearn的PCA - python

我有一个大输入矩阵,大小为(20,20000),并且正在尝试使用sklearn Python软件包执行PCA。在这里,20代表20个主题,20,000代表20,000个特征。下面是示例代码:import numpy as np from sklearn.decomposition import PCA rng = np.random.RandomState(…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…