gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:41:16 27 4
gpt4 key购买 nike

我正在比较 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com