You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scipy minimize返回数组过大引发内存错误问题求助

问题分析与解决

核心内存错误原因

你遇到的MemoryError是因为使用了scipy minimize的默认优化方法(如BFGS),这类拟牛顿法需要维护n×n的Hessian矩阵近似,而你的参数数量是92445,对应的Hessian矩阵形状为(92445,92445),需要约63.7GiB内存,远超常规机器的内存容量。

代码中的其他问题

  1. minimize返回值处理错误:scipy.optimize.minimize返回的是OptimizeResult对象,不是直接的优化后数组,必须通过.x属性获取参数结果。你直接对返回值调用reshape会报错,修正方式如下:

    Df = minimize(P1, Df)
    D = Df.x.reshape(D.shape)  # 加上.x获取优化后的参数数组
    
    Xcf = minimize(P2, Xcf)
    Xc = Xcf.x.reshape(Xc.shape)
    
    Zf = minimize(P3, Zf)
    Z = Zf.x.reshape(Z.shape)
    
  2. vstack传参错误:np.vstack的参数必须是数组序列(列表或元组),你写的np.vstack(X, us*(Z-B))是错误的,正确写法为:

    A1 = np.vstack([X, us*(Z-B)])
    
  3. 参数数量过大的优化策略问题:针对9万+的参数规模,拟牛顿法完全不适用,需要换用不需要存储Hessian矩阵的优化方法:

    • 选择L-BFGS-B:该方法是BFGS的内存高效版本,只存储最近几次迭代的Hessian信息,内存占用为O(n)而非O(n²)。
    • 选择Nelder-Mead:无梯度的单纯形法,不需要计算梯度或Hessian,适合大规模参数优化。

    调用示例(使用L-BFGS-B):

    Df = minimize(P1, Df, method='L-BFGS-B')
    
  4. P3函数参数名冲突:函数参数名Z与全局变量Z重名,容易导致逻辑混淆,建议修改参数名,比如改为Zi:

    def P3(Zi):
        Zi = Zi.reshape(Z.shape)
        A = Zi - np.matmul(D, Xc) - B
        return (np.linalg.norm(A, 'fro'))**2 + (l/u)*np.linalg.norm(Zi, 1)
    

额外优化建议

  • 目标函数中频繁计算的固定矩阵(比如us*(Z-B)、np.vstack([X, us*(Z-B)])如果迭代中不变)可以提前预计算,减少重复计算开销。
  • 对于超大规模优化问题,考虑使用PyTorch或TensorFlow等框架,它们支持自动微分和更高效的大规模优化器(如Adam、Adagrad)。

内容的提问来源于stack exchange,提问作者Federico Calabretti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:50:23