python - 使用稀疏矩阵与 numpy 数组

标签 python numpy matrix scipy scikit-learn

我正在用 Python 创建一些带有字数统计的 numpy 数组:行是文档,列是字 X 的计数。如果我有很多零计数,人们建议在进一步处理这些时使用稀疏矩阵,例如在分类器中。将 numpy 数组与稀疏矩阵馈送到 Scikit 时 logistic regression classifier , 然而,它似乎并没有太大的区别。所以我想知道三件事:

  • Wikipedia

    a sparse matrix is a matrix in which most of the elements are zero

    这是确定何时使用稀疏矩阵的合适方法吗 格式 - 一旦 > 50 % 的值是零?或者它使 以防万一有用吗?

  • 在像我这样的任务中,稀疏矩阵对性能有多大帮助, 特别是与 numpy 数组或标准列表相比?
  • 到目前为止,我将我的数据收集到一个 numpy 数组中,然后转换成 Scipy 中的 csr_matrix .这是正确的方法吗?我不能 找出如何从头开始构建稀疏矩阵,然后 可能是不可能的。

非常感谢任何帮助!

最佳答案

scipy 稀疏矩阵包和 MATLAB 中的类似包基于从线性代数问题发展而来的思想,例如求解大型稀疏线性方程(例如有限差分和有限元实现)。因此,诸如矩阵乘积(numpy 数组的 乘积)和方程求解器之类的东西得到了很好的发展。

我的粗略经验是,稀疏 csr 矩阵乘积必须具有 1% 的稀疏度才能比等效的密集 dot 运算更快 - 换句话说,一个非零每 99 个零的值。 (但请参阅下面的测试)

但是人们也尝试使用稀疏矩阵来节省内存。但请记住,这样的矩阵必须存储 3 个值数组(至少以 coo 格式)。所以稀疏度必须小于 1/3 才能开始节省内存。显然,如果您首先构建密集数组并从中创建稀疏数组,则不会节省内存。

scipy 包实现了许多稀疏格式。 coo 格式最容易理解和构建。根据文档构建一个并查看其 .data.row.col 属性(3 个一维数组)。

csrcsc 通常是从 coo 格式构建的,并稍微压缩了数据,使它们更难理解。但它们具有大部分数学功能。

索引 csr 格式也是可能的,尽管通常这比等效的密集矩阵/数组情况慢。其他操作,如更改值(尤其是从 0 到非零)、串联、增量增长等操作也较慢。

lil(lists of lists)也很容易理解,最适合增量构建。 dok 实际上是一个字典子类。

一个关键点是稀疏矩阵仅限于 2d,并且在许多方面表现得像 np.matrix 类(尽管它不是子类)。

使用 scikit-learnsparse 搜索其他问题可能是找出使用这些矩阵的优缺点的最佳方式。我已经回答了很多问题,但我比“学习”方面更了解“稀疏”方面。我认为它们很有用,但我的感觉是合适的并不总是最好的。任何定制都在 learn 端。到目前为止,sparse 包还没有针对这个应用程序进行优化。


我刚刚尝试了一些矩阵乘积测试,使用 sparse.random 方法创建具有指定稀疏度的稀疏矩阵。稀疏矩阵乘法的表现比我预期的要好。

In [251]: M=sparse.random(1000,1000,.5)

In [252]: timeit M1=M*M
1 loops, best of 3: 2.78 s per loop

In [253]: timeit Ma=M.toarray(); M2=Ma.dot(Ma)
1 loops, best of 3: 4.28 s per loop

这是一个尺寸问题;对于较小的矩阵,密集的 dot 更快

In [255]: M=sparse.random(100,100,.5)

In [256]: timeit M1=M*M
100 loops, best of 3: 3.24 ms per loop

In [257]: timeit Ma=M.toarray(); M2=Ma.dot(Ma)
1000 loops, best of 3: 1.44 ms per loop

但是比较索引

In [268]: timeit M.tocsr()[500,500]
10 loops, best of 3: 86.4 ms per loop

In [269]: timeit Ma[500,500]
1000000 loops, best of 3: 318 ns per loop

In [270]: timeit Ma=M.toarray();Ma[500,500]
10 loops, best of 3: 23.6 ms per loop

关于python - 使用稀疏矩阵与 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969886/

相关文章:

python - 在 django 中显示管理面板中的图像时出错

python - 将小数变为整数

python - 将最后 X 列值求和到新列中

arrays - 如何增加元胞数组的大小?

python - 来自 python 字典的图形 networkx

python - Cython 编译正常,但找不到符号 : __ZNSs4_Rep20_S_empty_rep_storageE when running on Mac OS

python - 如何绘制 3D 曲面?

python - Pandas、SciPy 或 NumPy 是否提供累积标准差函数?

matrix - 带有 lisp 的矩阵中的行总和

c++ - 如何在 C++ boost ublas 中将文件流式传输到矩阵中?