np.sum对稀疏矩阵行求和出现非预期非零结果如何解决?
解决方案
你遇到的是双精度浮点数计算的常见精度误差,误差量级在1e-16级别,远小于你矩阵元素的有效数值,可通过以下几种方式解决:
- 方案1:直接对稀疏矩阵行求和,避免转稠密数组时的额外精度损耗
scipy稀疏矩阵自带的求和方法底层逻辑适配稀疏存储结构,精度表现更稳定:
该方法得到的结果误差会远小于转稠密后用row_sums = sp_m.sum(axis=1).A1np.sum的结果,多数场景下可直接得到和为0的结果。 - 方案2:显式使用逐个累加逻辑
如果你需要严格匹配逐个累加的计算结果,可以用np.add.reduce实现逐个累加,规避numpy默认成对求和的精度差异:dense = sp_m.toarray() # 对每行做逐个累加 row_sums = np.apply_along_axis(lambda x: np.add.reduce(x), axis=1, arr=dense) - 方案3:后处理截断微小误差
由于你的行和理论值严格为0,误差仅为1e-16级别,可直接根据业务精度容忍阈值做截断,实现成本最低:# 阈值可根据你的数值量级调整,1e-12足以覆盖双精度浮点数的常规误差范围 row_sums = np.sum(sp_m.toarray(), axis=1) row_sums[np.abs(row_sums) < 1e-12] = 0 - 方案4:使用更高精度浮点类型计算
对精度要求极高的场景,可将矩阵转为长双精度类型后再求和:row_sums = np.sum(sp_m.toarray().astype(np.longdouble), axis=1).astype(np.float64)
内容的提问来源于stack exchange,提问作者Ioanna K.
相关产品推荐
相关产品推荐

