我正在比较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
上的误差