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

标签 python c++ numpy lapack

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

sgels 和 linalg.lstsq 使用的方法在数学上有什么区别?

在数值上比较结果(即回归系数)时,预期误差是多少(例如 6 位有效数字)?

仅供引用:我绝不是 C++ 或 Python 专家,因此很难理解函数内部发生的事情。

最佳答案

查看 numpy 的源代码,在文件 linalg.py 中,lstsq依赖LAPACK的zgelsd()对于复杂和 dgelsd()真正的。这是与 sgels() 的区别:

  • dgelsd()用于 double同时 sgels()用于 float .有精度差异...
  • dgels()使用矩阵 A 的 QR 因式分解并假设 A 具有满秩。矩阵的条件数必须合理才能得到显着的结果。参见 this course获取方法的逻辑。另一方面,dgelsd()利用 A 的奇异值分解。特别是,A 可能是秩亏的,并且根据附加参数 rcond 丢弃小的奇异值。或机器精度。请注意 numpy 的默认值 rcond-1 :负值是指机器精度。参见 this course逻辑。
  • 根据 benchmark of LAPACK ,可以期待dgels()dgelsd() 快 5 倍左右.

您可能会发现 sgels() 的结果存在显着差异和 dgelsd()如果矩阵是病态的。事实上,线性回归的误差存在界限,这取决于算法和 rcond() 的值。那是用过的。参见 the user guide of LAPACK on, Error Bounds for Linear Least Squares Problems用于估计误差和 Further Details: Error Bounds for Linear Least Squares Problems了解技术细节。

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

关于python - C++(LAPACK、sgels)和Python(Numpy、lstsq)结果的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41637108/

相关文章:

c++ - 静态构建qt后找不到qt creator

python - 对数据框中所有行组合求和的更快方法

python - 尽可能快地在 python 中导入大的 tecplot block 文件

python - Numpy 工程符号

python - Django 'AnonymousUser' 对象没有属性 '_meta'

python - 如何在一个主窗口上做多个用户界面

python - Django 管理文档生成器未格式化模型的文档字符串

c++ - C2470 错误 Visual Studio 2012 和 Qt 4.8.6

c++ - 一个空的 C++ 文件有什么用?

python - 在Python中使用Xpath按属性选择祖先节点