C / C ++中的最小二乘回归

如何在C / C ++中实现因子分析的最小二乘回归?

这个黄金标准是LAPACK 。 你想要的,尤其是xGELS

当我不得不处理用于非线性参数拟合的大型数据集和大型参数集时,我使用了RANSAC和Levenberg-Marquardt的组合。 我正在用成千上万的数据点来讨论数以千计的参数。

RANSAC是一种强大的算法,通过使用减少的数据集来最小化由exception值引起的噪声。 它不是严格的最小二乘法,但可以应用于许多拟合方法。

Levenberg-Marquardt是一种在数值上求解非线性最小二乘的有效方法。 在大多数情况下,收敛率介于最速下降和牛顿法之间,而不需要计算二阶导数。 在我检查过的情况下,我发现它比Conjugate渐变更快。

我这样做的方法是将RANSAC设置为围绕LM方法的外环。 这非常强大但很慢。 如果您不需要额外的稳健性,您可以使用LM。

获取ROOT并使用TGraph::Fit() (或TGraphErrors::Fit() )?

但是,为安装者安装的大而重的软件。 适合我,因为我已经安装了它。

或者使用GSL 。

如果你想自己实现一个优化算法,Levenberg-Marquard似乎很难实现。 如果不需要真正的快速收敛,请看一下Nelder-Mead单纯形优化算法。 它可以在几小时内从头开始实施。

http://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method

看看http://www.alglib.net/optimization/

他们有L-BFGS和Levenberg-Marquardt的C ++实现。

您只需要计算出目标函数的一阶导数就可以使用这两种算法。

我使用TNT / JAMA进行线性最小二乘估计。 它不是很复杂,但相当快捷+容易。

让我们首先谈谈因子分析,因为上面的大部分讨论都是关于回归的。 我的大多数经验都是使用SAS,Minitab或SPSS等软件来解决因子分析方程,因此我在直接求解这些方面的经验有限。 也就是说,最常见的实现不使用线性回归来求解方程。 据此,最常用的方法是主成分分析和主成分分析。 在应用多变量分析(达拉斯约翰逊)的文本中,记录了七种方法,每种方法各有利弊。 我强烈建议找到一个实现,为您提供因子分数,而不是从头开始编写解决方案。

之所以采用不同的方法,是因为您可以准确选择最小化的方法。 这里对方法的广度进行了非常全面的讨论。