我了解主成分分析和奇异值分解在代数/精确水平之间的关系。我的问题是关于scikit-learn的实现。
该文档说:“ [TruncatedSVD]与PCA非常相似,但是直接对样本矢量进行运算,而不是对协方差矩阵进行运算。 ”,这将反映两种方法之间的代数差异。但是,后来又说:“ 此估算器[TruncatedSVD]支持两种算法:快速随机SVD求解器,和“天真”算法,该算法使用ARPACK作为(X * XT)或(XT * X)上的特征求解器,高效。关于PCA,它表示:“使用数据的奇异值分解来投影以减少线性维数……”。PCA实施支持相同的两种算法(随机和ARPACK)求解器以及另一种算法LAPACK。查看代码,我可以看到PCA和TruncatedSVD中的ARPACK和LAPACK都对样本数据X进行了svd,ARPACK能够处理稀疏矩阵(使用svds)。
因此,除了具有不同的属性和方法之外,PCA还可以使用LAPACK进行精确的全奇异值分解,PCA和TruncatedSVD scikit-learn实现似乎是完全相同的算法。第一个问题:这是正确的吗?
第二个问题:即使LAPACK和ARPACK使用scipy.linalg.svd(X)和scipy.linalg.svds(X)作为X样本矩阵,它们也会计算或X的奇异值分解或特征分解∗ X T内部。虽然“随机化”的求解器不需要计算乘积。(这与数值稳定性有关,请参阅为什么通过数据的SVD对数据进行PCA?)。这个对吗?