Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 稀疏矩阵的R-内部处理_Python_R_Scikit Learn_Sparse Matrix_Pca - Fatal编程技术网

Python 稀疏矩阵的R-内部处理

Python 稀疏矩阵的R-内部处理,python,r,scikit-learn,sparse-matrix,pca,Python,R,Scikit Learn,Sparse Matrix,Pca,我一直在比较Python和R中几种PCA实现的性能,并注意到一个有趣的行为: 虽然在Python中似乎不可能计算稀疏矩阵的PCA(唯一的方法是截断SVD),但它不支持将平均中心化要求等效于PCA的协方差解。 他们的论点是,这将破坏矩阵的稀疏性。其他实现,如Facebook的PCA算法或scikit learn中的PCA/randomPCA方法,出于类似原因,不支持稀疏矩阵 虽然所有这些对我来说都是有意义的,但几个R包,如rsvd等,能够处理稀疏矩阵(例如,使用rsparsematrix生成),甚

我一直在比较Python和R中几种PCA实现的性能,并注意到一个有趣的行为:
虽然在Python中似乎不可能计算稀疏矩阵的PCA(唯一的方法是截断SVD),但它不支持将平均中心化要求等效于PCA的协方差解。 他们的论点是,这将破坏矩阵的稀疏性。其他实现,如Facebook的PCA算法或scikit learn中的PCA/randomPCA方法,出于类似原因,不支持稀疏矩阵

虽然所有这些对我来说都是有意义的,但几个R包,如rsvd等,能够处理稀疏矩阵(例如,使用
rsparsematrix
生成),甚至允许特定的
center=True
参数

我的问题是,R如何在内部处理这个问题,因为它似乎比类似的Python实现要高效得多。 R是否仍然通过进行绝对缩放来保持稀疏性(这在理论上会伪造结果,但至少保持稀疏性)? 或者是否有任何方法可以明确存储零值的平均值,并且只存储一次(而不是单独存储每个值)

要推迟,请稍候: R如何在不影响RAM使用的情况下,以平均居中方式在内部存储矩阵。
希望这足够简洁….

这里的关键是部分SVD()的底层实现不存储矩阵。而是记录矩阵中线性运算的结果 应用于从上一次迭代中获得的一小组向量

我不会解释c代码中使用的具体方法,这是非常先进的(请参见说明),我将用一个更简单的算法来解释它,该算法抓住了如何保持稀疏性的效率的关键思想:幂法(或将其推广到多特征值的子空间迭代法).该算法通过迭代应用线性算子,然后归一化(或在子空间迭代的情况下正交化一小组向量),返回矩阵a的最大特征值

您在每次迭代中所做的是

v=A*v
v=v/norm(v)
矩阵乘法步骤是关键的一步,所以让我们看看当我们尝试以a为中心的a做同样的事情时会发生什么。以a为中心的矩阵公式(以
center
作为平均列值的向量,
one
作为1的向量)是:

因此,如果我们将迭代算法应用于这个新矩阵,我们将得到

v=A*v-dotproduct(center,v)*ones


由于A是稀疏的,我们可以在(A,v)和
-dotproduct(center,v)上使用稀疏矩阵向量积* < < /代码>只需要从结果向量中减去中心和V的点乘积,这是一个线性的< <代码> >。

这是一个有趣的问题,但我不是100%确定,所以最好问这个地方。你可以考虑问一下,我认为你更有可能得到答案。谢谢你的暗示。我是个骗子。考虑到这一点,因为它可能被标记为交叉验证。也许我也会在那里问,如果它仍然没有回答,我想答案会在
?irlba
:“使用可选的'center'参数从'A'的每一列中隐式减去'center'向量中的值,计算'sweep'的截断SVD(A,2,center,FUN=
-
)”,而不显式地形成居中矩阵”(强调添加;换句话说,这是一种算法技巧,而不是存储技巧)。然后你必须看看代码:看看
center
参数在算法中是如何实际使用的。也许你可以看看感谢链接,但我不完全确定这会有什么帮助?文章中甚至没有提到稀疏矩阵,代码完全基于python…我已经知道pythonn不支持稀疏处理(至少不是scikit learn的“高效”包)。
v=A*v-dotproduct(center,v)*ones