结果是C ++(LAPACK,sgels)和Python(Numpy,lstsq)之间的区别

时间:2017-01-13 14:42:32

标签: python c++ numpy lapack

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

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

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

仅供参考:我绝不是C ++或Python专家,因此很难理解函数内部的内容。

1 个答案:

答案 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
  • 根据benchmark of LAPACK,on 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上的错误。