【问题标题】:Algorithm to detect a linear behaviour in a data set检测数据集中线性行为的算法
【发布时间】:2013-07-15 10:31:36
【问题描述】:

我前段时间发布了一个关于Algorithm to make a polynomial fit of a part of a data set 的问题,并收到了一些建议来做我想做的事。但是我现在面临另一个问题,我尝试应用答案中提出的想法。 我的目标是找到数据集的最佳线性拟合,其中只有一部分是线性的。

这是我必须做的一个例子:

我们有这两个数据集,我必须对虚线左侧数据的线性部分做一个线性趋势。用红色表示,我们有理想的数据集,从开始到虚线都有一个线性部分。在蓝色部分,我们有一个“有问题的”数据集,它有一个平台期。粗体部分是我必须用来对数据进行线性拟合的部分。

我的问题是我试图按照上面链接的问题中提到的那样做:我找到了平滑数据的二阶导数,并查看了它何时“不够接近”为 0。但这是我对有问题的结果数据集(第一张图片)和理想数据集(第二张图片):

(对不起质量,我不知道为什么它这么模糊) 在两张图像上,我绘制了一阶导数,红色绘制了二阶导数。在第一张图像上,我们看到了二阶导数值的峰值。但问题是峰值不是非常“高”,因此很难建立一个阈值来判断集合是否是线性的......相反,一阶导数的峰值非常高,使得它很容易在视觉上看到。

我认为计算一阶导数的平均值并查看该值何时与平均值相差太大就足够了......但是当我取一阶导数的平均值时查看值与平均值不同的地方,由于峰值存在某种偏移。

如何删除此偏移量以便仅获取右侧数据的平均值(在图像 1 上看到的不连续性左侧的数据可能是非线性的,也可能是线性,但与右边的值有不同的值!)有效的峰值?

【问题讨论】:

  • 你如何计算你的导数?如果没有正确执行,数值微分会增加很多噪音。我首先对原始数据进行平滑处理(使用合适的低通滤波器),然后使用样条对其进行插值,然后获取样条的导数。这应该会给你一个更平滑的导数近似,你的峰值应该更容易检测到。
  • @FlorianBrucker,我可以用两种方法做到这一点。第一个(我用来制作这些数字的那个)是用dy = diff(smooth(y));dx = diff(x);dydx = dy./dx; dx2 = (dx(1:end-1)+dx(2:end))/2; d2ydx2 = diff(dydx)./dx2; 之类的东西估计导数。第二个是你刚才提到的方法。奇怪的是,第一种方法效果更好……
  • 您似乎知道感兴趣的端点。因此,最好简单地取端点而不是平均值。可能在取终点之前稍微平滑数据。 --- 此外,还要确保您的算法以正确的方式处理具有趋势的线性区域。

标签: matlab


【解决方案1】:

mean 运算符(如您所见)对异常值(峰值)非常敏感。您可能希望使用更稳健的估算器,例如 median 或值的 x 百分位数(应该更适合您的情况)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2011-08-20
    • 2011-01-04
    • 2020-11-18
    相关资源
    最近更新 更多