我在Python中创建了一些带有单词计数的numpy数组:行是文档,列是单词X的计数。如果我有很多零计数,人们建议在进一步处理时使用稀疏矩阵,例如在分类器中。然而,当将numpy数组与稀疏矩阵馈送到Scikitlogistic regression classifier中时,似乎没有太大的区别。所以我想知道三件事:
a sparse matrix is a matrix in which most of the elements are zero
这是确定何时使用稀疏矩阵的合适方法吗 格式-只要>;50%的值为零?或者它能 以防万一用得通吗?
非常感谢您的帮助!
没有一般规则。这完全取决于你以后的确切用法。你必须根据稀疏矩阵和无稀疏矩阵计算模型的复杂度,然后才能找到“最佳点”。这将取决于样品数量和尺寸。一般来说,它通常归结为形式的矩阵乘法
其中X是数据矩阵N X d,W是某个权重矩阵d X K。因此,“密集”乘法需要
NdK
时间,而稀疏乘法则假设每行的平均稀疏度为p是NpdK
。因此,如果你的稀疏度是50%,你可以期待近2倍的速度运行。较难的部分是估计稀疏访问的开销,而不是高度优化的密集访问。对于LR的特定情况,这甚至比密集格式快几倍,但是为了观察差异,您需要大量高维数据(1000)。
不,这不是个好办法。你可以“从头开始”建立它,例如首先建立一个字典,然后转换它,等等。有很多方法可以先建立稀疏矩阵,而不需要密集矩阵。
@hpaulj您的时间不对,您将sparse.random映射到numpy数组(它的slowwish)的结果很慢,请记住:
为了接近纽比我们需要
稀疏矩阵包和MATLAB中类似的包基于线性代数问题的思想,例如求解大型稀疏线性方程(例如,有限差分和有限元实现)。因此,矩阵积(numpy数组的
dot
积)和方程求解器等都得到了很好的开发。我的粗略经验是,稀疏矩阵乘积必须具有1%的稀疏性,才能比等效的密集运算更快,换句话说,每99个零对应一个非零值。(但见下面的测试)
但是人们也尝试使用稀疏矩阵来节省内存。但请记住,这样的矩阵必须存储3个值数组(至少是
coo
格式)。所以稀疏度必须小于1/3才能开始节省内存。显然,如果首先构建密集数组,然后从中创建稀疏数组,就不会节省内存。scipy
包实现了许多稀疏格式。coo
格式最容易理解和构建。根据文档构建一个并查看其.data
、.row
和.col
属性(3个1d数组)。csr
和csc
通常是根据coo
格式构建的,并将数据压缩一点,使它们更难理解。但是他们有大部分的数学功能。索引
csr
格式也是可能的,尽管通常这比等效的密集矩阵/数组情况慢。其他操作,如改变值(特别是从0到非零)、连接、增量增长,也比较慢。lil
(列表列表)也很容易理解,最适合增量构建。dok
实际上是一个字典子类。一个关键点是稀疏矩阵仅限于2d,并且在许多方面表现得像
np.matrix
类(尽管它不是子类)。使用
scikit-learn
和sparse
搜索其他问题可能是找到使用这些矩阵的优缺点的最佳方法。我已经回答了很多问题,但我更了解“稀疏”的一面,而不是“学习”的一面。我认为它们很有用,但我的感觉是,合身并不总是最好的。任何定制都在learn
端。到目前为止,sparse
包尚未为此应用程序进行优化。我刚刚尝试了一些矩阵乘积测试,使用
sparse.random
方法创建具有指定稀疏性的稀疏矩阵。稀疏矩阵乘法的性能比我预期的要好。这是一个大小问题;对于较小的矩阵,密集的
dot
更快但是比较索引
相关问题 更多 >
编程相关推荐