使用L1范数的多项式拟合

时间:2013-06-12 13:53:41

标签: c++ math regression curve-fitting

我有n个点(x0,y0),(x1,y1)......(xn,yn)。 n很小(10-20)。我想用低阶(3-4)多项式拟合这些点:P(x)= a0 + a1 * x + a2 * x ^ 2 + a3 * x ^ 3.

我使用最小二乘法作为误差度量,即最小化f =(p0-y0)^ 2 +(p1-y1)^ 2 + ... +(pn-yn)^ 2。我的解决方案是利用奇异值分解(SVD)。

现在我想使用L1范数(绝对值距离)作为误差度量,即最小化f = | p0-y0 | + | p1-y1 | + ... + | pn-yn |。

是否有可以执行此操作的库(最好是开源),可以从C ++调用?是否有可用的源代码可以快速修改以满足我的需求?

3 个答案:

答案 0 :(得分:1)

是的,它应该是可行的。将多项式拟合问题公式化为多元线性回归的标准方法是定义变量x1,x2等,其中xn定义为x。^ n(Matlab表示法中的元素指数)。然后,您可以将所有这些向量(包括截距)连接到设计矩阵X:

X = [1 x1 x2 x3]

那么你的多项式拟合问题就是一个回归问题:

argmin_a(| y - X * a |)

其中| |符号是你想要的成本函数(对于你的情况,L1范数)和a是权重向量(抱歉,据我所知,SO没有很好的数学加价)。这种回归被称为“稳健回归”,而数字食谱有一个例程来计算它们:http://www.aip.de/groups/soe/local/numres/bookfpdf/f15-7.pdf

希望这有帮助!

答案 1 :(得分:1)

L_1回归实际上非常简单地表述为线性程序。你想要

minimize    error
subject to  x_1^4 * a_4 + x_1^3 * a_3 + x_1^2 * a_2 + x_1 * a_1 + a_0 + e_1 >= y_1
            x_1^4 * a_4 + x_1^3 * a_3 + x_1^2 * a_2 + x_1 * a_1 + a_0 - e_1 <= y_1
            .
            .
            .
            x_n^4 * a_4 + x_n^3 * a_3 + x_n^2 * a_2 + x_n * a_1 + a_0 + e_n >= y_n
            x_n^4 * a_4 + x_n^3 * a_3 + x_n^2 * a_2 + x_n * a_1 + a_0 - e_n <= y_n
            error - e_1 - e_2 - ... - e_n = 0.

您的变量是a_0, a_1, a_2, a_3, a_4error和所有e变量。 xy是您问题的数据,因此x显示为第二,第三和第四权力没有问题。

您可以使用GLPK(GPL)或lp_solve(LGPL)或任意数量的商业软件包解决线性编程问题。我喜欢GLPK,如果它的许可证不是问题,我建议使用它。

答案 2 :(得分:0)

L1规范的问题在于它不可区分,因此依赖衍生物的任何最小化者都可能失败。当我试图使用例如最小化这些功能时共轭梯度最小化,我发现答案卡在扭结处,即函数y = | x |中x = 0。

我经常从第一原则解决这些数学计算问题。这里可能有用的一个想法是目标函数在低阶多项式的系数中将是分段线性的。因此,有可能通过从最小二乘法出来的多项式开始求解,然后通过求解一系列线性问题来改进解,但每次只从当前最佳解决方案步进到最近的纠结。