我正在努力实现以下等式:
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.38ms。但是这个解决方案有点“棘手”,因为我使用稀疏矩阵来存储稠密矩阵,我想知道这到底有多有效。
所以我的问题是,是否有某种方法可以将稀疏C和稠密Y相乘,而不必将Y变为稀疏并提高性能?如果C可以被表示为对角线密集型而不消耗大量内存,那么这可能会导致非常高效的性能,但我不知道这是否可能。
谢谢你的帮助!
当计算r=dot(C,Y)时,dot乘积会遇到内存问题,原因是numpy的dot函数不支持处理稀疏矩阵。现在发生的是numpy将稀疏矩阵C看作一个python对象,而不是numpy数组。如果你在小范围内检查,你可以直接看到问题:
很明显,以上不是你感兴趣的结果。相反,您要做的是使用scipy的sparse.csr_matrix.dot函数进行计算:
或者更紧凑
首先,你真的确定你的问题需要进行一个完整的矩阵反演吗?大多数情况下,只需要计算x=A^-1y,这是一个更容易解决的问题。
如果真是这样,我会考虑计算逆矩阵的近似值,而不是全矩阵的逆。因为矩阵反演的成本很高。有关逆矩阵的有效近似,请参见Lanczos algorithm示例。近似值可以作为奖励稀疏存储。另外,它只需要矩阵向量运算,所以您甚至不必存储整个矩阵来进行逆运算。
另一种方法是,使用pyoperators,还可以使用to.todense方法使用有效的矩阵向量运算来计算要求逆的矩阵。对角矩阵有一个特殊的稀疏容器。
对于Lanczos算法的实现,您可以查看pyoperators(免责声明:我是这一软件的合著者之一)。
尝试:
我的时间安排:
相关问题 更多 >
编程相关推荐