C++(LAPACK,sgels)和Python(Numpy,lstsq)结果之间的差异



我正在比较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。精度有差异
  • CCD_ 8利用矩阵A的QR因子分解。矩阵的条件数必须是合理的,才能得到显著的结果。请参阅本课程以了解该方法的逻辑。另一方面,dgelsd()利用了A的奇异值分解。特别地,A可以是秩定义的,并且根据附加参数rcond或机器精度来讨论小奇异值。请注意,numpy对rcond的默认值是-1:负值表示机器精度。有关逻辑,请参阅本课程
  • 根据LAPACK的基准,on可以预期dgels()dgelsd()快大约5倍

如果矩阵条件不好,您可能会看到sgels()dgelsd()的结果之间存在显著差异。事实上,线性回归的误差有一个界限,它取决于所使用的算法和rcond()的值。有关误差估计,请参阅LAPACK的用户指南"线性最小二乘问题的误差界",有关技术详细信息,请参阅"进一步详细信息:线性最小二乘问题误差界"。

总之,如果b中的度量是准确的并且容易与解释变量相关,则可以使用sgels()dgels()。例如,如果传感器被放置在排气管的出口处,就很容易猜测哪些电机在运行。但有时,来源和测量之间的线性联系并不精确(A术语的不确定性),或者根据测量来区分污染者变得更加困难(一些污染者远离传感器组,A条件不好)。在这种情况下,dgelsd()和调整rcond参数会有所帮助如有疑问,请使用dgelsd(),并根据LAPACK的用户指南估计估计的x上的误差

最新更新