gpt4 book ai didi

python - 有效地将 Numpy/Scipy 稀疏和密集矩阵相乘

转载 作者:IT老高 更新时间:2023-10-28 21:17:25 36 4
gpt4 key购买 nike

我正在努力实现以下等式:

X =(Y.T * Y + Y.T * C * Y) ^ -1

Y 是 (n x f) 矩阵,C 是 (n x n) 对角线矩阵; n 约为 300k,f 将在 100 到 200 之间变化。作为优化过程的一部分,该方程将被使用近 1 亿次,因此必须非常快速地处理它。

Y 是随机初始化的,C 是一个非常稀疏的矩阵,对角线上的 300k 中只有少数数字会与 0 不同。由于 Numpy 的对角函数创建密集矩阵,因此我将 C 创建为稀疏 csr 矩阵。但是当试图解方程的第一部分时:

r = dot(C, Y)

计算机因内存限制而崩溃。然后我决定尝试将 Y 转换为 csr_matrix 并进行相同的操作:

r = dot(C, Ysparse)

这种方法耗时 1.38 毫秒。但是这个解决方案有点“棘手”,因为我使用稀疏矩阵来存储密集矩阵,我想知道这到底有多有效。

所以我的问题是,是否有某种方法可以将稀疏 C 和密集 Y 相乘,而不必将 Y 变为稀疏并提高性能?如果 C 可以以某种方式表示为对角密集而不消耗大量内存,那么这可能会导致非常高效的性能,但我不知道这是否可能。

感谢您的帮助!

最佳答案

在计算 r = dot(C,Y) 时点积遇到内存问题的原因是 numpy 的 dot 函数没有原生支持处理稀疏矩阵。正在发生的事情是 numpy 将稀疏矩阵 C 视为 python 对象,而不是 numpy 数组。如果您进行小规模检查,您可以直接看到问题:

>>> from numpy import dot, array
>>> from scipy import sparse
>>> Y = array([[1,2],[3,4]])
>>> C = sparse.csr_matrix(array([[1,0], [0,2]]))
>>> dot(C,Y)
array([[ (0, 0) 1
(1, 1) 2, (0, 0) 2
(1, 1) 4],
[ (0, 0) 3
(1, 1) 6, (0, 0) 4
(1, 1) 8]], dtype=object)

显然以上不是您感兴趣的结果。相反,您要做的是使用 scipy 的 sparse.csr_matrix.dot 函数进行计算:

r = sparse.csr_matrix.dot(C, Y)

或更紧凑

r = C.dot(Y)

关于python - 有效地将 Numpy/Scipy 稀疏和密集矩阵相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13272453/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com