使用float128类型的Numpy矩阵求逆。

4
我得到了一个由float128值构成的矩阵"x",但在进行操作时出现了以下错误:
> q = (inv(xt * x) * xt) * n
> array type float128 is unsupported in linalg

这里的xt是转置后的x,n是另一个float128矩阵。该矩阵的所有其他操作都像转置或矩阵乘法一样正确处理。

是的,我需要float128来处理这种情况,否则结果会与我们参考的接近实际值的结果有所不同。


这个错误信息对我来说似乎很直白:NumPy中的float128支持不完整或不一致。 - xnx
@xnx 是的,我需要一个解决方法 :p - gerosalesc
这听起来有点像XY问题。如果你正在测试计算出的浮点结果与期望的参考结果,你无论如何都不能指望完全相等,因此你需要在测试中建立一个公差;再多的精度也无法消除这种需求。(当然,这个公差应该是另一个困难且任务相关的问题。)你确定你需要额外的精度吗? - Mark Dickinson
4
另外一条评论:从你展示的代码来看,似乎你在解决一个最小二乘问题。你不使用现有的NumPy和SciPy最小二乘例程的原因是什么?那些很可能比一个自制版本更具数值稳健性。(特别是实际上反演xt*x并不是解决最小二乘问题最有效或最稳定的方式。) - Mark Dickinson
1
相关链接:http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/. 直接求逆矩阵几乎从来都不是一个好主意。 - ali_m
@MarkDickinson 这个函数的最终目的是使用类似于z = c0 + c1x + c2y + c3xy +...的三元立方函数拟合曲线,该项目的数学专家建议我们可以使用这种方法,他甚至在Excel(是的,Excel)中进行了测试,并且结果接近,尽管与真实结果相比差异非常重要。我尝试过使用scipy的curve_fit,但没有成功,不过我想这可能会引发另一个问题。 - gerosalesc
1个回答

0

4
这取决于平台。在 macOS 上,虽然它无法提供你可能希望的 IEEE 754 binary128 格式,但确实有 numpy.float128 数据类型。它对应于标准的80位x87扩展精度类型,并带有6个字节的填充。(同样,在Linux上通常会有一个 numpy.float96 数据类型。) - Mark Dickinson
更多信息请参见Nathaniel Smith在此处的出色答案:https://dev59.com/pmox5IYBdhLWcg3wpV7F#17023995 - Mark Dickinson
这是一篇好文章,解释得很清楚。看起来我的答案并没有真正回答问题,但如果longdouble是正确的方法,它可以指向一个回答的方向。 - veda905
我怀疑 OP 已经在使用 np.longdouble。这就是问题的原因!对于 np.longdouble 类型的支持并没有一直延伸到核心线性代数操作。 - Mark Dickinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接