在 Python 中对稀疏矩阵执行分解

Posted

技术标签:

【中文标题】在 Python 中对稀疏矩阵执行分解【英文标题】:Performing Decomposition on Sparse Matrices in Python 【发布时间】:2015-07-07 22:30:24 【问题描述】:

我正在尝试使用sklearn 库在 Python 中的大型稀疏矩阵中分解组件中的信号(矩阵分解)。

我利用 scipy 的scipy.sparse.csc_matrix 来构建我的数据矩阵。但是我无法执行任何分析,例如因子分析或独立成分分析。我唯一能做的就是使用 truncatedSVD 或 scipy 的 scipy.sparse.linalg.svds 并执行 PCA。

有人知道在 python 中对稀疏矩阵进行 ICA 或 FA 的任何变通方法吗?任何帮助将非常感激!谢谢。

【问题讨论】:

【参考方案1】:

给定:

M = UΣV^t

SVD 的缺点是矩阵 U 和 V^t 是密集矩阵。输入矩阵是否稀疏并不重要,U 和 T 将是密集的。此外,SVD 的计算复杂度为 O(n^2*m) 或 O(m^2*n),其中 n 是输入矩阵 M 中的行数,m 是列数。这取决于哪个最大.

值得一提的是,SVD 将为您提供最佳解决方案,如果您可以承受由frobenius norm 计算的较小损失,您可能需要考虑使用CUR algorithm。它将扩展到具有 O(n*m) 的更大数据集。

U = CUR^t

其中 C 和 R 现在是 SPARSE 矩阵。

如果您想查看 python 实现,请查看pymf。但是要小心那个确切的实现,因为在这个时间点上,似乎有一个open issue 与实现。

【讨论】:

【参考方案2】:

即使输入矩阵是稀疏的,输出也不会是稀疏矩阵。如果系统不支持密集矩阵,则也不支持结果

【讨论】:

【参考方案3】:

通常是best practice 使用coo_matrix 建立矩阵,然后使用.tocsc() 对其进行转换来操作它。

【讨论】:

以上是关于在 Python 中对稀疏矩阵执行分解的主要内容,如果未能解决你的问题,请参考以下文章

避免使用 Eigen 分解稀疏矩阵时的动态内存分配

在 R 中执行非负矩阵分解

大型稀疏矩阵上的快速非负矩阵分解

奇异分解(SVD) 案例--用户与商家稀疏矩阵

用于文档分类的 scipy/sklearn 稀疏矩阵分解

具有特征库的块稀疏矩阵