我正在比较C ++和Python计算的数值结果。在C ++中,我利用LAPACK的sgels函数来计算线性回归问题的系数。在Python中,我使用Numpy的linalg.lstsq函数来完成类似的任务。
sgels和linalg.lstsq使用的方法之间的数学差异是什么?
在数字上比较结果(即回归系数)时,预期误差(例如6位有效数字)是多少?
仅供参考:我绝不是C ++或Python专家,因此很难理解函数内部的内容。
答案 0 :(得分:4)
在文件linalg.py中查看numpy的来源,lstsq依赖于LAPACK的zgelsd()
表示复杂,dgelsd()
表示真实。以下是sgels()
的差异:
dgelsd()
适用于double
,而sgels()
适用于float
。精度有差异...... dgels()
使用矩阵A的QR分解,并假设A具有满秩。矩阵的条件数必须合理才能获得显着的结果。有关获取方法逻辑的信息,请参阅this course。另一方面,dgelsd()
使用A的奇异值分解。特别地,A可以是秩无定义的,并且根据附加参数rcond
或机器精度来放弃小的奇异值。请注意,rcond
的numpy默认值为-1
:负值表示机器精度。有关逻辑,请参阅this course。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则是conditionned)。在这种情况下,dgelsd()
和调整rcond
参数可以提供帮助。 如有疑问,请使用dgelsd()
并根据LAPACK's user guide估算估算x
上的错误。