【问题标题】:Algorithm to make a polynomial fit of a part of a data set对数据集的一部分进行多项式拟合的算法
【发布时间】:2013-07-09 21:01:01
【问题描述】:

我有一个算法问题。我不知道 stackoverflow 是否是发布它的正确位置,但由于我使用 matlab 并想用它来做这件事,所以我把它贴在那里。 我的问题如下:我有一组数据,除了在这组数据的末尾,点必须非常线性之外,我对此了解不多。我想对这些线性分布的点进行线性拟合,而不使用不是的部分。

(图像总是更好理解):

正如您在此处看到的,我有蓝色数据,它不是线性的,但在末尾有一个线性部分(红色部分)。我想要的是找到一种算法,让我知道数据曲线的行为何时结束其线性。

不知道我说清楚了吗?

我尝试在右侧取几个点,然后对这几个点进行线性拟合。然后在少数几个点上添加一些点,并检查这些点是否“足够接近”线性拟合。然后再次与添加的点进行线性拟合,依此类推,但我认为这不是最佳解决方案,因为“第一个”点有很多噪声(图像上未在此处表示)...

你有什么想法或提议或链接吗?

谢谢!

【问题讨论】:

  • 它最终会变得几乎是线性的吗?或者您对任何路段中最长的直线感兴趣?
  • @Fallen 我不确定它是否会一直这样做,但我认为在大多数情况下,它会非常线性。 “任何线段中最长的直线”是什么意思?
  • 我的意思是你对在最后输入数据处结束的唯一直线段感兴趣吗?
  • @Fallen 不,我不知道。我只想要合身,它不必经过最后一点。
  • 此数据看起来很符合逻辑,并带有额外的线性趋势。

标签: algorithm


【解决方案1】:

我想要的是找到一种算法,让我知道数据曲线的行为何时结束其线性。

线性数据有一个特别好的特性,它具有恒定的斜率。线性截面的二阶导数应近似为零。

使用样条拟合(如果数据嘈杂,则进行某种平滑)来获得数据的连续版本,称之为g(x)。当g''(x) ~ 0,即二阶导数小时,这是一个线性部分。

【讨论】:

【解决方案2】:

按 x 位置截取您的数据集,然后设置一些线性截止值。

  • 从一端开始
  • 检查图表下一个预定义部分的 pearson 相关系数
  • 如果超过某个阈值,则将 x 包含的部分添加到您的范围中,否则停止

或者,您可以检查线性是否是多个多项式拟合的最佳拟合。为此,我会:

  • 定义一些 1-n 阶的通用函数,其中 n 非常小(可能为 3)
  • 向线性测试集添加数据点
  • 比较 n 个函数的最小二乘值
  • 如果线性具有最低的最小二乘值,或者在您的 n 函数的最小值的某个距离内,请继续添加点。否则停下来,说函数在最后一次相加之前是线性的。

这些至少是非常简单的方法,在我的奥卡姆剃刀头脑中,它们也具有最低的复杂性(在这两种情况下都是 n*curve-fit 复杂度,尽管第二种情况的常数更大。),虽然它是很有可能存在复杂度较低的算法。

【讨论】:

  • 我会试试这个,但它和我之前做的完全一样。还是谢谢
  • @mwoua 您也可以在非线性部分递归并获得所有线性部分,但我不确定这对您是否有价值。
【解决方案3】:

一种方法是用 2 多项式来近似它,从右到左有越来越多的点,并注意第三个系数。由于它足够小,分布也足够线性。

问题是,除了凭经验之外,很难确定数量“足够小”。

另一种方法可能是将线性近似值与真实数据进行比较。以同样的方式从右到左添加点测量近似标准偏差。只要它是令人满意的,近似是好的,数据可能被认为是线性的。

这样会好一点,因为偏差是一个相当透明的概念。

【讨论】:

    【解决方案4】:

    如果你有分段线性行为和突然的转换,你可以尝试一个合适的形式

    E[Y] = b0 + b1 * x + b2 * I + b3 * x * I
    

    其中 I 是 indicator function,当满足某些条件时为 1,否则为 0。对于您的示例,条件可能是x > 0。如果两个线段平行,b2 系数将捕获垂直位移,而 b3 项是一个“交互”,将捕获指标断点两侧的斜率变化。

    如果过渡更加渐进,如您所画的,那么我同意@A.Webb 关于逻辑与趋势的评论。

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2017-02-03
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多