在稀疏矩阵上执行外积之和
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 X
和 Y
,Z = X*Y.T = sum_i xi*yi.T
,其中 Z
是 n-by-m。以上是关于在稀疏矩阵上执行外积之和的主要内容,如果未能解决你的问题,请参考以下文章