【问题标题】:Least Median of Squares robust regression C++最小二乘稳健回归 C++
【发布时间】:2017-03-25 19:56:24
【问题描述】:

我有一组数据 z(0), z(1), z(2)...,z(n),我目前正在拟合 p(x,y) = a(1)*x^2+a(2)*y^2+a(3)*x*y+a(4) 类型的 2 个变量多项式。我有 i=1,...,n (x(i),y(i)) 坐标,我强加为 p(x(i),y(i))=z(i)。这样,我就有了一个可以使用 Eigen SVD 解决的超定系统。我正在寻找一种可以处理异常值的更复杂的方法,例如最小二乘稳健回归(如here 所述),但我还没有找到 2 个变量的 C++ 实现。我查看了 GSL,但似乎没有 2 个变量函数。我能想到的唯一其他解决方案是在ROOT 中使用 TGraph2D。你知道其他解决方案吗?也许是数字食谱?由于我正在编写 C++ 代码,因此我更喜欢 C 或 C++ 实现。

【问题讨论】:

    标签: c++ statistics regression eigen


    【解决方案1】:

    由于尚未给出答案,但我仍在研究这个问题,我将在这里分享我的进展。

    TLinearFitter 类有一个 fit 方法,允许您选择稳健拟合 - 最小修剪平方回归 (LTS):

    https://root.cern.ch/root/html532/TLinearFitter.html

    另一种可能的解决方案,可能更耗时,但从长远来看可能更有效的是编写我自己的函数以最小化,并且使用: https://projects.coin-or.org/Ipopt 将其最小化。虽然在这种方法中有一个更大的“步骤”。我不知道如何使用这个库,而且我(还没有?)找到一个很好的教程来理解它。

    这里:https://wis.kuleuven.be/stat/robust/software 有一个名为 PROGRESS 的 LMedS 算法的 Fortran 实现。所以另一种可能的解决方案是将这个软件移植到 C/C++ 并用它制作一个库。

    【讨论】:

    • 最后我使用了 TLinearFitter::EvalRobust 方法。它运作良好,它的主要缺点当然是性能。 SVD 快得多。
    猜你喜欢
    • 2018-01-23
    • 2016-04-01
    • 2015-05-15
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2012-11-28
    相关资源
    最近更新 更多