C++(LAPACK、sgels)和Python(Numpy、lstsq)结果的区别

Tho*_*mas 1 c++ python numpy lapack

我正在比较 C++ 和 Python 计算的数值结果。在 C++ 中,我使用 LAPACK 的 sgels 函数来计算线性回归问题的系数。在 Python 中,我使用 Numpy 的 linalg.lstsq 函数来完成类似的任务。

sgels 和 linalg.lstsq 使用的方法之间的数学差异是什么?

以数字方式比较结果(即回归系数)时的预期误差(例如 6 位有效数字)是多少?

仅供参考:我绝不是 C++ 或 Python 专家,因此很难理解函数内部发生了什么。

fra*_*cis 5

查看 numpy 的来源,在文件linalg.py 中,lstsq 依赖于 LAPACK 的zgelsd()复杂和dgelsd()真实。以下是与 的区别sgels()

  • dgelsd()是为doublesgels()float。精度有区别...
  • dgels()使用矩阵 A 的 QR 分解并假设 A 具有满秩。矩阵的条件数必须合理才能得到显着的结果。请参阅本课程以获取方法的逻辑。另一方面,dgelsd()利用 A 的奇异值分解。特别是,A 可能是秩亏的,并且根据附加参数rcond或机器精度丢弃小的奇异值。请注意,对于numpy的默认值rcond-1:负值指机器精度。看这个课程逻辑,。
  • 根据LAPACK基准,可以期望dgels()比 快 5 倍左右dgelsd()

您可能会看到的结果之间的差异显著sgels()dgelsd()如果矩阵生病conditionned。事实上,线性回归的误差是有界限的,这取决于算法和所使用的算法的值rcond()。请参阅LAPACK 的用户指南,关于误差估计的线性最小二乘问题的误差范围和更多详细信息:线性最小二乘问题的误差范围有关技术细节的。

作为结论,sgels()并且dgels()可以如果措施中使用的b是准确的,容易与解释变量。例如,如果传感器放置在排气管的出口处,就很容易猜出哪些电机正在运行。但有时,源和措施之间的线性联系并不准确(A 项的不确定性)或根据测量区分污染者变得更加困难(一些污染者远离传感器组,而 A 是病态的)条件)。在这种情况下,dgelsd()调整rcond参数会有所帮助。如有疑问,请根据LAPACK 的用户指南使用dgelsd()和估计误差。x