【问题标题】:Fitting an unknown curve [closed]拟合未知曲线
【发布时间】:2012-12-16 03:44:58
【问题描述】:

我遇到了一些相关的问题(例如thisthisthisthis),但它们都涉及将数据拟合到已知曲线。有没有办法将给定的数据拟合到未知曲线?我的意思是,给定一些数据,算法会给我一个拟合,它是一个函数或函数的总和。我正在用 C 编程,但我完全不知道如何使用 gsl 包来做到这一点。我愿意使用任何可以(理想情况下)通过 C 进行管道传输的东西。但是对于我应该寻找的方向的任何帮助将不胜感激。

编辑:这基本上是我收集的实验(物理)数据,所以数据会有一些被加性高斯分布噪声修改的趋势。一般来说,趋势是非线性的,所以我猜线性回归拟合方法是不合适的。至于排序,数据是按时间排序的,所以曲线一定要按这个顺序拟合。

【问题讨论】:

  • “我的意思是,给定一些数据,算法会给我一个拟合,它是一个函数或函数的总和”:那么你的曲线被称为某些函数的总和。我猜Taylor seriesFourier series 可能是您正在寻找的,因为它们允许将函数表示为项的无限总和。
  • 这有点未指定。有很多曲线拟合方法(回归、泰勒级数、傅里叶、样条等),但它们都是针对特定应用量身定制的。在不了解您的数据的情况下(即最初是什么产生了潜在趋势),很难给出具体的答案。
  • 您是否知道数据的排序(也称为参数化),或者它是否也会根据曲线拟合而发生变化?即,如果您的积分排序为:{Pt1, Pt2, Pt3};您是否希望它们在投影到曲线上时以相同的顺序结束,或者它们最终可能成为 {Pt2, Pt1, Pt3} 之类的东西?如果顺序是固定的,@amit 下面的回答似乎是合理的。否则,有更复杂的算法可以根据一些错误对数据集进行排序,同时提供拟合。请在您的问题中详细说明。

标签: c algorithm statistics curve-fitting


【解决方案1】:

您可能希望使用 (Fast) Fourier Transforms 将数据转换为频域。

借助变换的结果(一组幅度、相位和频率),即使是最扭曲的数据集也可以用以下形式的几个函数 (harmonics) 表示:

r * cos(f * t - p)

其中 r 是谐波幅度,f 是频率,p 是相位。

最后,未知数据曲线是所有谐波的总和。

我在R 中做过这个(你有一些例子),但我相信 C 有足够的工具来管理它。也可以对 C 和 R 进行管道传输,但对其了解不多。 This 可能会有所帮助。

这种方法非常适合处理大量数据,因为它具有以下复杂性:

1) 使用快速傅里叶变换 (FTT) = O(n log n) 分解数据

2) 使用结果组件构建函数 = O(n)

【讨论】:

  • 但是这会不会在计算上更加昂贵,因为我必须进行傅里叶变换然后找出组件?虽然对我来说,对于任意曲线来说这听起来确实很简单......
  • @Kitchi 快速傅里叶变换 (FTT) 比经典的离散傅里叶变换 (blogs.mathworks.com/steve/2012/05/01/…) 快得多。弄清楚组件不是问题,因为我认为它具有 O(n) 的复杂性
  • 一些 FTT 实现的复杂度为 O(n log n),这意味着它们的计算量很小。这意味着他们可以轻松管理大量数据,而使用多项式插值 O(n^2) 的方法则不能。
【解决方案2】:

另一种选择是使用linear regression,但多维

这里的技巧是人为地生成额外的尺寸。您可以通过简单地在原始数据集上隐含一些函数来做到这一点。一个常见的用法是生成多项式以匹配数据,所以在这里你暗示的函数是 f(x) = x^i 用于所有 i < k(其中 k 是你想要获得的多项式的次数)。

例如,(0,2),(2,3)k = 3 的数据集你将获得额外的 2 个维度,你的数据集将是:(0,2,4,8),(2,3,9,27)

线性回归算法将找到多项式p(x) = a_0 + a_1*x + ... + a_k * x^k 的值a_0,a_1,...,a_k,与预测模型相比,该值使数据中每个点的误差最小化(p(x) 的值)。

现在,问题是 - 当您开始增加维度时 - 您正在从欠拟合(一维线性回归)转向过拟合(当 k==n 时,您实际上得到多项式插值)。

要“选择”什么是最佳 k 值 - 您可以使用 cross-validation,并根据您的交叉验证选择使错误最小化的 k

请注意,此过程可以完全自动化,您只需迭代检查所需范围内的所有k1,然后选择带有k 根据交叉验证最小化错误。


(1) 范围可以是 [1,n] - 虽然这可能会太费时,但我会选择 [1,sqrt(n)] 甚至是 [1,log(n)] - 但这只是一种预感。

【讨论】:

    【解决方案3】:

    您可能正在寻找数值分析领域的polynomial interpolation

    在多项式插值中 - 给定一组点 (x,y) - 您试图找到适合这些点的最佳多项式。一种方法是使用Newton interpolation,这很容易编程。

    数值分析和插值领域被广泛研究,你也许可以得到多项式误差的一些不错的上限。

    但是请注意,因为您正在寻找最适合您的数据的多项式,而该函数并不是真正的多项式 - 当远离您的初始训练集时,错误的规模会爆炸。


    另请注意,您的数据集是有限的,并且有无数(实际上是不可枚举的无穷大)函数可以拟合数据(精确或近似) - 所以其中哪一个是最好的可能是具体的到你真正想要达到的目标。

    如果您正在寻找一个模型来拟合您的数据,请注意线性回归和多项式插值处于比例的两端:多项式插值可能对模型过度拟合,而线性回归可能对其拟合不足,究竟应该使用什么是具体情况,并因一个应用程序而异。


    简单多项式插值示例

    假设我们有 (0,1),(1,2),(3,10) 作为我们的数据。

    我们使用牛顿法得到的表1是:

    0  | 1 |                 |
    1  | 2 | (2-1)/(1-0)=1   |
    3  | 9 | (10-2)/(3-1)=4  | (4-1)/(3-0)=1
    

    现在,我们得到的多项式是以最后一个元素结尾的“对角线”:

    1 + 1*(x-0) + 1*(x-0)(x-1) = 1 + x + x^2 - x = x^2 +1 
    

    (这确实与我们使用的数据完美契合)


    (1) 表是递归创建的:前 2 列是 x,y 值 - 下一列基于前一列。一旦你得到它,它真的很容易实现,完整的解释在维基百科页面中牛顿插值。

    【讨论】:

    • 反对者:请发表评论。它可能不适合任何事情 - 但没有灵丹妙药,我试图在答案中解释这种方法的缺点。
    猜你喜欢
    • 2015-03-02
    • 2023-02-01
    • 2021-01-19
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2013-09-04
    • 2013-11-08
    • 2017-04-21
    相关资源
    最近更新 更多