拟合分段线性数据

信息处理 算法
2021-12-27 01:30:47

什么是拟合分段线性但噪声数据的稳健方法?

我正在测量一个信号,它由几个几乎线性的段组成。我想自动地将几行数据拟合到数据中以检测转换。

数据集由几千个点组成,有 1-10 个段,我知道段的数量。

这是我想自动执行的示例。

在此处输入图像描述

4个回答

我天真地尝试了两种方法(仅使用 3 段)。肯定会有更好的方法。

    RANSAC,应该是一个强大的拟合机制。在若干段之后很容易停止算法。然而,至少通过简单的实现,可能难以强制段之间的连续性(正如您的应用程序中所要求的那样)。作为概念验证,我从数据点创建了一个图像,以便我可以使用中可用的 RANSAC 引擎,即 Mathematica 的线检测功能。ImageLines

在此处输入图像描述

    使用通用最小化器拟合分段线性模型。执行分段连续性很容易。有趣的是,对残差和其他属性的测试可能会提供足够的信息来自动确定分段的数量——不过我还没有尝试过。这就是它在 Mathematica 中的样子:

在此处输入图像描述

我并不声称以下方法是可靠的,但它可能对你有用。对于数千个点和可能有十个左右的直线段,请按以下步骤进行。x[n]

  • 处理点以创建位数组,如下所示。 这里与直线的接近程度的概念到。行家将认识到该标准要求通过 )的直线具有几乎相同的斜率x[n]y[n]

    y[n]={1,if |(x[n+1]x[n])(x[n]x[n1])|<ϵ,0,otherwise.
    ϵx[n1],x[n],x[n+1](n1,x[n1])(n,x[n])(n,x[n])(n+1,x[n+1])

  • 如果 s的 10 条左右的长行程组成的数组,这些行程 s 的行程隔开,偶尔会到处散落 s 来破坏美丽,放松,你走在正确的轨道上。秒的运行太少或太多重复上一步y[n]1011ϵ

  • 使用线性最小均方误差曲线拟合将直线拟合到由标识为属于同一直线段的点。您现在有十个直线拟合点,例如 Line A 拟合点线 B 适合点,线 C 适合点,依此类推。向右扩展 A 向左扩展 B 以找出它们相交的位置;向右扩展 B 和向左扩展 C 以找出它们相交的位置等。恭喜,您现在拥有数据的连续分段线性模型。y[n]x[3]x[88]x[94]x[120]x[129]

(多年后)分段线性函数是 1 次样条,可以告诉大多数样条拟合器这样做。 例如, scipy.interpolate.UnivariateSpline 可以使用k=1 平滑参数运行s,您必须使用它 - 请参阅 scipy-interpolation-with-univariate-splines
在 Matlab 中,请参阅 how-to-choose-knots

补充:找到最优节点并不容易,因为可以有很多局部最优。相反,你给 UnivariateSpline 一个目标s,error ^ 2 的总和,并让它确定结的数量。拟合后,get_residual()将得到error^2的实际总和,以及get_knots()节数。一个小的变化s可能会改变很多结,特别是在高噪音 - ymmv。
该图显示了对各种 . 的随机分段线性函数 + 噪声的拟合s

有关拟合分段常数,请参阅 Step detection可以用于 pw 线性吗?不知道;从区分噪声数据开始会增加噪声,这是错误的。

欢迎使用其他测试功能和/或论文或代码链接。几个链接:
分段线性回归与节点作为参数线性样条曲线对节点的放置位置非常敏感。knot-selection-for-cubic-regression-splines这是一个棘手的问题,并且大多数人只是通过反复试验来选择结。一种越来越流行的方法是使用惩罚回归样条曲线。




2014 年 3 月添加: 动态编程 是解决嵌套子问题的通用方法,如下所示:

optimal k lines
    = optimal k - 1 lines up to some x
    + cost of the last line x to the end
over x  (all x in theory, nearby x in practice)

动态编程非常聪明,但它能否在这项任务中击败蛮力+启发式?
请参阅 Erik Demaine 在 MIT 6.006 Intro to algorithm
下的优秀课程笔记, 以及谷歌分段线性回归
和 约翰亨利综合征。


在此处输入图像描述

取导数并寻找价值几乎恒定的区域。您需要创建算法来搜索具有理想 +/- 斜率水平的那些区域,这将为您提供该部分的线斜率。在进行截面分类之前,您可能希望执行一些平滑处理,例如滑动平均值。下一步将是获得 y 交点,这在那时应该是微不足道的。