在稀疏矩阵上执行外积之和

Posted

技术标签:

【中文标题】在稀疏矩阵上执行外积之和【英文标题】:performing sum of outer products on sparse matrices 【发布时间】:2011-10-20 06:23:02 【问题描述】:

我正在尝试使用 scipy 的 sparse 包实现以下等式:

W = x[:,1] * y[:,1].T + x[:,2] * y[:,2].T + ...

其中 x & y 是一个 nxm csc_matrix。基本上我试图将 x 的每个 col 乘以 y 的每个 col 并将得到的 nxn 矩阵相加。然后我想让所有非零元素为 1。

这是我当前的实现:

    c = sparse.csc_matrix((n, n))
    for i in xrange(0,m):
        tmp = bam.id2sym_thal[:,i] * bam.id2sym_cort[:,i].T
        minimum(tmp.data,ones_like(tmp.data),tmp.data)
        maximum(tmp.data,ones_like(tmp.data),tmp.data)

        c = c + tmp

这个实现存在以下问题:

    内存使用量似乎呈爆炸式增长。据我了解,内存只会随着 c 变得不那么稀疏而增加,但我看到循环开始消耗 >20GB 的内存,an=10,000, m=100,000(x 和 y 的每一行只有大约 60 个非零个元素)。

    我正在使用效率不高的python循环。

我的问题:有没有更好的方法来做到这一点?控制内存使用是我首先关心的问题,但让它更快更好!

谢谢!

【问题讨论】:

x[:,i] 将为您提供x 的第 i 列,而不是行 @JoshAdel:你说得对,我说错了,我的意思是用 x 的列乘以 y 的列。我已经更新了这个问题。谢谢! 你的方程是内积的总和,而不是外积的总和。您必须转置y 的列,而不是x。 (要么是这样,要么是标题错误。) 请编辑您的问题以明确尊重转置。您是否打算计算每个非零元素在外积中相加的次数?谢谢 @Steve:你说得对,Steve-我已经更正了。谢谢 【参考方案1】:

就内存和性能而言,这可能是使用Cython 的首选。

以下论文的一部分描述了它在稀疏 scipy 矩阵中的使用:

http://folk.uio.no/dagss/cython_cise.pdf

【讨论】:

【参考方案2】:

请注意,您描述的外积之和与将两个矩阵相乘相同。换句话说,

sum_i X[:,i]*Y[:,i].T == X*Y.T

所以只需将矩阵相乘即可​​。

Z = X*Y.T

对于 n=10000 和 m=100000 并且每列在 X 和 Y 中都有一个非零元素,它几乎可以立即在我的笔记本电脑上进行计算。

【讨论】:

最后一步是将非零元素设置为 1,例如 Z.data[:]= 1。如果这就是 OP 正在寻找的东西,这还不是很清楚。谢谢 这是我采用的解决方案。这对所有矩阵都是如此,还是取决于我的向量有多稀疏?我采用了eat 的建议,并将所有非零元素也设置为1。谢谢! X = [x1 x2 ... xk] 其中xi 是n×k 矩阵X 中的第i 列。设Y = [y1 y2 ... yk] 其中yi 是m- 中的第i 列by-k 矩阵 Y。然后对于 any XYZ = X*Y.T = sum_i xi*yi.T,其中 Z 是 n-by-m。

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

图像去噪基于matlab稀疏表示KSVD图像去噪含Matlab源码 2016期

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

使用 sklearn 对大型稀疏矩阵执行 PCA

大型稀疏矩阵分解

稀疏矩阵定义以及存储格式(COO,CSR,CSC)

数组稀疏矩阵广义表综合应用