我有算法问题。我不知道stackoverflow是否是发布它的正确位置,但由于我使用matlab并希望用它来做,我将它发布在那里。 我的问题如下:我有一组数据,我不太了解它,除了在这个集合结束时,点必须是非常线性的。我想对线性分布的这些点进行线性拟合,而不使用不是的部分。
(图片总是更好理解):
如你所见,我有蓝色数据,这不是线性的,但最后有一个线性部分(红色部分)。我想要的是找到一种算法,让我知道数据曲线的行为何时结束其线性。
我不知道我是否清楚?
我试过在右边拿几个点,并对这几点进行线性拟合。然后向少数人添加一些点并检查它们是否“接近”线性拟合。然后使用添加的点再次进行线性拟合等等,但我认为这不是最佳解决方案,因为“第一”点有很多噪声(图像上没有表示)...
您有任何想法,主张或链接吗?
谢谢!
答案 0 :(得分:4)
我想要的是找到一种算法,让我知道数据曲线的行为何时结束其线性。
线性数据具有特别好的属性,它具有恒定的斜率。线性部分的二阶导数应该近似为零。
使用样条拟合(如果数据有噪声,使用某种平滑)来获取数据的连续版本,将其称为g(x)
。当g''(x) ~ 0
时,即当二阶导数很小时,这是一个线性部分。
答案 1 :(得分:1)
通过x-position对数据集进行片段化,然后设置一些线性截止值。
或者,您可以检查线性是否是多个多项式拟合的最佳拟合。为此我会:
这些至少是非常直接的方式,而且在我的奥卡姆的剃刀头脑中,它们也具有最低的复杂度(在两种情况下都是曲线拟合复杂度,尽管第二种具有更大的常数。),尽管它是很可能那里有较低复杂度的算法。
答案 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关于物流与趋势的评论。