6

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

(图像总是更好理解):在此处输入图像描述

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

不知道我说清楚了吗?

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

您有任何想法或提议或链接吗?

谢谢 !

4

4 回答 4

4

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

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

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

于 2013-07-11T14:43:43.640 回答
1

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

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

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

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

于 2013-07-12T13:58:19.623 回答
1

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

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

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

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

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

于 2013-07-11T14:28:01.150 回答
0

如果您有带有突然转换的分段线性行为,您可以尝试以下形式

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

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

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

于 2013-07-11T15:17:42.370 回答