我一直在比较Python和R中几个PCA实现的性能,并注意到一个有趣的行为:
虽然似乎无法在Python中计算稀疏矩阵的PCA(唯一的方法是scikit-learn的TruncatedSVD,但它不支持所需的均值居中以等效于PCA的协方差解决方案。 他们的论点是,这将破坏矩阵的稀疏属性。 Facebook的PCA算法或scikit learn中的PCA/randomPCA方法等其他实现由于类似的原因不支持稀疏矩阵。
虽然似乎无法在Python中计算稀疏矩阵的PCA(唯一的方法是scikit-learn的TruncatedSVD,但它不支持所需的均值居中以等效于PCA的协方差解决方案。 他们的论点是,这将破坏矩阵的稀疏属性。 Facebook的PCA算法或scikit learn中的PCA/randomPCA方法等其他实现由于类似的原因不支持稀疏矩阵。
虽然我都理解,但是几个R包(如irlba,rsvd等)能够处理稀疏矩阵(例如使用rsparsematrix
生成),并且甚至允许特定的center=True
参数。
我的问题是,R是如何处理内部的,因为它似乎比可比的Python实现更有效率。 R是否仍通过进行绝对缩放来保持稀疏性(这理论上会使结果失真,但至少保持稀疏性)? 或者是否有任何方式可以显式地存储零值的平均值,并仅存储一次(而不是为每个值单独存储)?
为了解除保持状态: R如何在不爆炸式使用RAM的情况下内部存储具有均值居中的矩阵。 希望这足够简洁....
?irlba
中找到:“使用可选的‘center’参数,隐式从‘A’的每一列中减去‘center’向量的值,计算'sweep(A, 2, center, FUN=-
)'的截断SVD,而不需要显式形成居中矩阵”(强调添加;换句话说,这是一种算法技巧而不是存储技巧)。然后你需要查看代码:https://github.com/bwlewis/irlba/blob/master/R/irlba.R,以了解`center`参数如何在算法中实际使用。 - Ben Bolker