用于使数据集的一部分的多项式拟合的算法

时间:2013-07-11 14:21:18

标签: algorithm

我有算法问题。我不知道stackoverflow是否是发布它的正确位置,但由于我使用matlab并希望用它来做,我将它发布在那里。 我的问题如下:我有一组数据,我不太了解它,除了在这个集合结束时,点必须是非常线性的。我想对线性分布的这些点进行线性拟合,而不使用不是的部分。

(图片总是更好理解):enter image description here

如你所见,我有蓝色数据,这不是线性的,但最后有一个线性部分(红色部分)。我想要的是找到一种算法,让我知道数据曲线的行为何时结束其线性。

我不知道我是否清楚?

我试过在右边拿几个点,并对这几点进行线性拟合。然后向少数人添加一些点并检查它们是否“接近”线性拟合。然后使用添加的点再次进行线性拟合等等,但我认为这不是最佳解决方案,因为“第一”点有很多噪声(图像上没有表示)...

您有任何想法,主张或链接吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

  

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

线性数据具有特别好的属性,它具有恒定的斜率。线性部分的二阶导数应该近似为零。

使用样条拟合(如果数据有噪声,使用某种平滑)来获取数据的连续版本,将其称为g(x)。当g''(x) ~ 0时,即当二阶导数很小时,这是一个线性部分。

答案 1 :(得分:1)

通过x-position对数据集进行片段化,然后设置一些线性截止值。

  • 从一端开始
  • 检查图表下一个预定义部分的皮尔逊相关系数
  • 如果超过某个阈值,请将x的包含部分添加到您的范围内,否则停在那里

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

  • 定义一些1-n阶的泛型函数,其中n非常小(可能是3)
  • 将数据点添加到线性测试集
  • 比较n个函数的最小二乘值
  • 如果线性具有最小的最小二乘值,或者在n函数的最小值的某个距离内,则继续添加点。否则,在最后一次添加之前停止并说该函数是线性的。

这些至少是非常直接的方式,而且在我的奥卡姆的剃刀头脑中,它们也具有最低的复杂度(在两种情况下都是曲线拟合复杂度,尽管第二种具有更大的常数。),尽管它是很可能那里有较低复杂度的算法。

答案 2 :(得分:1)

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

事实是,除了经验之外,很难建立“足够小”的数字。

另一种方式可能是线性近似与实际数据的比较。从右到左添加点测量近似标准偏差的方法相同。一旦满意,则近似值很好,数据可能是线性的。

这有点好,因为偏差是一个非常透明的概念。

答案 3 :(得分:0)

如果你有突然转换的分段线性行为,你可以尝试使用

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

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

如果过渡更为渐进,正如你所描述的那样,那么我同意@ A.Webb关于物流与趋势的评论。