我正在比较 C++ 和 Python 计算的数值结果。在 C++ 中,我利用 LAPACK 的 sgels 函数来计算线性回归问题的系数。在 Python 中,我使用 Numpy 的 linalg.lstsq 函数来完成类似的任务。
sgels 和 linalg.lstsq 使用的方法之间有什么数学差异?
以数值方式比较结果(即回归系数)时的预期误差(例如 6 位有效数字)是多少?
仅供参考:我绝不是 C++ 或 Python 专家,这使得很难理解函数内部发生的情况。
看一下numpy的源码,在文件中linalg.py, lstsq 依赖于 LAPACK 的zgelsd()
对于复杂和dgelsd()
真正的。以下是差异sgels()
:
-
dgelsd()
is for double
while sgels()
is for float
。精度还是有差别的...
-
dgels()
使用矩阵 A 的 QR 分解并假设 A 具有满秩。矩阵的条件数必须合理才能得到有意义的结果。看这个课程用于获取该方法的逻辑。另一方面,dgelsd()
利用 A 的奇异值分解。特别是,A 可能是秩不足的,并且根据附加参数,小的奇异值会被丢弃rcond
或机器精度。请注意 numpy 的默认值rcond
is -1
:负值表示机器精度。看这个课程为了逻辑。
- 根据LAPACK基准, 可以预期
dgels()
大约快 5 倍dgelsd()
.
您可能会发现结果之间存在显着差异sgels()
and dgelsd()
如果矩阵是病态的。事实上,线性回归的误差是有界限的,这取决于算法和rcond()
即被使用。看LAPACK 用户指南,线性最小二乘问题的误差界用于估计误差和更多详细信息:线性最小二乘问题的误差界了解技术细节。
作为结论,sgels()
and dgels()
如果采取以下措施,则可以使用b
准确且易于与解释变量相关。例如,如果传感器放置在排气管的出口处,就很容易猜测哪些电机正在运行。但有时,源和测量之间的线性联系并不精确已知(A 项的不确定性),或者根据测量来区分污染者变得更加困难(一些污染者距离传感器组很远,而 A 是病态的)。有条件)。在这种情况下,dgelsd()
并调整rcond
争论会有所帮助。每当有疑问时,请使用dgelsd()
并估计估计的误差x
根据LAPACK的用户指南.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)