起因是代码中有一步涉及矩阵求逆运算,如下:
adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])),
shape=(one_hot_labels.shape[0], one_hot_labels.shape[0]),
dtype=np.float32)
adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)
eigen_adj = None
if self.compute_s:
eigen_adj = self.c * inv((sp.eye(adj.shape[0]) - (1 - self.c) * self.adj_normalize(adj)).toarray())
报错:
MemoryError X
Unable to allocate 28.5 GiB for an array with shape (61806, 61806) and data type float64
因为我的电脑只有16G内存,就想着把精度改成float32,但发现还是不行,即使把inv()括号里的稀疏矩阵改为float32型,inv()返回的好像还是float64,请问怎么样才能返回float32呢?
后来我又尝试了把numpy库的代码改了
但是还是不行,依旧报错:
请问有人知道这是怎么回事嘛?
这段代码中出现了内存问题,具体原因是在求逆运算中需要创建一个大尺寸的数组来存储矩阵,但是系统无法为这个数组分配足够的内存空间。其中shape=(61806, 61806),数据类型为float64的数组需要的空间大约是28.5 GiB。
建议您可以尝试使用稀疏矩阵来解决这个问题。例如,使用scipy库中的sparse.linalg.inv来替代numpy库中的inv。这样可以减少内存消耗,并减少计算时间。
同时,还可以尝试使用分块矩阵和分块矩阵求逆的方法来解决问题,这样可以将大矩阵分解成小的块来计算,也可以减少内存消耗。
还有可以考虑使用有限元方法来求解问题,有限元方法可以将问题转化为较小的线性方程组来解决。
综上,可以尝试使用稀疏矩阵,分块矩阵和有限元方法来解决问题。