微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

高效稀疏矩阵乘法特例

如何解决高效稀疏矩阵乘法特例

假设我有一个维度为 X 的稀疏矩阵 (N*J) x K。我想计算以下总和:

sum_Xi = 0
for i in range(N):
    Xi = X[i*J:(i+1)*J,:]                 # (J x K)
    Xi_sum = Xi.sum(axis=0)               # (1 x K)
    temp = Xi_sum.transpose().dot(Xi_sum) # (K x K)
    sum_Xi += temp

也就是说,我的稀疏矩阵具有 NJ x K 块的“块”结构。这个总和的最终结果是 K x K。显然,上面的求和非常低效,但不依赖于任何中间(可能很大)矩阵。

我目前的做法如下

V = csr_matrix((np.ones(N*J),(np.repeat(range(N),J),range(N*J))))  # (N x (N*J))
temp = V.dot(X)                                                       # (N x K)  
sum_Xi = temp.transpose().dot(temp).toarray().                        # (K x K)

这明显更快,但是 K <<< N < N*J 所以当最终结果如此之小时,我对将这个 VV.dot(X) 留在内存中并不感到兴奋。

有什么建议吗?

提前谢谢你!!

编辑:使 V csr 而不是 csc 是明显的改进,在上面进行了更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。