【发布时间】:2018-06-22 19:42:53
【问题描述】:
我必须执行大量这样的计算:
X.dot(Y).dot(Xt)
X = 1 x n 矩阵
Y = 对称 n x n 矩阵,每个元素为 5 个值之一(例如 0、0.25、0.5、0.75、1)
Xt = n x 1 矩阵,X 的转置,即X[np.newaxis].T
X 和 Y 是稠密的。我遇到的问题是大 n,由于内存问题,我无法存储和使用矩阵 Y。我仅限于使用一台机器,所以分布式计算不是一种选择。
我突然想到 Y 有 2 个特性,理论上可以减少存储 Y 所需的内存量:
- Y 的元素被一小部分值覆盖。
- Y 是对称的。
如何在实践中实现这一点?我查找了对称矩阵的存储,但据我所知,所有 numpy 矩阵乘法都需要“解包”对称性以生成常规的 n x n 矩阵。
我了解 numpy 专为内存计算而设计,因此我愿意接受不依赖于 numpy 的基于 python 的替代解决方案。我也愿意牺牲速度来提高内存效率。
【问题讨论】:
-
sparse 的用法听起来不适合您的任务(包括标题和标签用法)!此外,它相当广泛。这听起来有点像:我怎样才能为我的任务实现我自己的矩阵例程,这不是微不足道的。特征 1 可以通过使用一个字节或更少作为类型来利用,而特征 2 在稀疏矩阵工具中很常见,所以有很多文献。
-
@dkato 他说 X 和 Y 是密集的。此外,我认为 scipy 的稀疏矩阵中没有对称性利用。
-
小 n 的示例 Y:[[0, 0.5, 0.25, 1], [0.5, 0, 0.75, 0.25], [0.25, 0.75, 0, 0.25], [1, 0.25, 0.25, 0]] 我可能对稀疏有误,但我的理解是存储整数索引和对 5 个不同值的引用比为每个元素存储一个浮点数要便宜。我有什么问题吗?
-
@sascha 对,对不起。我对标题和文字感到困惑。
-
当然可以更便宜。但是稀疏矩阵通常被定义为(wiki):在数值分析和计算机科学中,稀疏矩阵或稀疏数组是其中大部分元素为零的矩阵,这是非常不同的。这与存储条目所需的位数无关,而与条目模式的存储方式有关(涉及利用对称性;但与条目的离散性无关)。
标签: python numpy matrix sparse-matrix