Scipy稀疏...数组?

spi*_*tor 48 python numpy matrix scipy sparse-matrix

所以,我正在使用非常稀疏的numpy数组进行一些Kmeans分类 - 很多很多零.我想我会使用scipy的'稀疏'软件包来减少存储开销,但我对如何创建数组而不是矩阵有点困惑.

我已经完成了关于如何创建稀疏矩阵的教程:http: //www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7

为了模拟一个数组,我只是创建一个1xN矩阵,但正如你可能猜到的,Asp.dot(Bsp)不能正常工作,因为你不能将两个1xN矩阵相乘.我必须将每个数组转换为Nx1,这非常蹩脚,因为我会为每个点积计算做这个.

接下来,我尝试创建一个NxN矩阵,其中第1列==第1行(这样您可以将两个矩阵相乘,只需将左上角作为点积),但结果证明效率非常低.

我喜欢使用scipy的稀疏包作为numpy的数组()的神奇替代品,但到目前为止,我还不确定该怎么做.

有什么建议?

Rad*_*dim 34

使用scipy.sparse基于行或列的格式:csc_matrixcsr_matrix.

它们使用高效的C实现(包括乘法),并且转置是一个无操作(特别是如果你调用transpose(copy=False)),就像numpy数组一样.

编辑:通过ipython的一些时间:

import numpy, scipy.sparse
n = 100000
x = (numpy.random.rand(n) * 2).astype(int).astype(float) # 50% sparse vector
x_csr = scipy.sparse.csr_matrix(x)
x_dok = scipy.sparse.dok_matrix(x.reshape(x_csr.shape))
Run Code Online (Sandbox Code Playgroud)

现在x_csr,x_dok50%稀疏:

print repr(x_csr)
<1x100000 sparse matrix of type '<type 'numpy.float64'>'
        with 49757 stored elements in Compressed Sparse Row format>
Run Code Online (Sandbox Code Playgroud)

时间安排:

timeit numpy.dot(x, x)
10000 loops, best of 3: 123 us per loop

timeit x_dok * x_dok.T
1 loops, best of 3: 1.73 s per loop

timeit x_csr.multiply(x_csr).sum()
1000 loops, best of 3: 1.64 ms per loop

timeit x_csr * x_csr.T
100 loops, best of 3: 3.62 ms per loop
Run Code Online (Sandbox Code Playgroud)

所以看起来我说谎了.换位很便宜,但CSR*CSC没有高效的C实现(在最新的0.9.0 SciPy的).每次调用都会构造一个新的csr对象:-(

作为一个黑客(虽然现在scipy相对稳定),你可以直接在稀疏数据上做点积:

timeit numpy.dot(x_csr.data, x_csr.data)
10000 loops, best of 3: 62.9 us per loop
Run Code Online (Sandbox Code Playgroud)

注意,这最后一种方法再次进行了numpy密集乘法.稀疏度为50%,因此它实际上比dot(x, x)2倍快.

  • +1 numpy.dot.对于kmeans,你想要argmax(点(kx N个中心,每个Nvec x)); 无论如何,中心变得密集,所以也可以让它们保持密集.(对于新中心来说,平均许多稀疏xs的速度非常慢.) (5认同)
  • 似是而非.我更喜欢(建议)[此代码](http://stackoverflow.com/questions/5529625/is-it-possible-to-specify-your-own-distance-function-using-scikits-learn-k-means) ,可以使用scipy.spatial.distance中任意20多个指标; 对于高昏暗的kmeans而言,度量比算法更重要. (3认同)