拟合分段线性数据


18

拟合分段线性但有噪声的数据的可靠方法是什么?

我正在测量一个信号,它由几个几乎线性的部分组成。我想将几行原子地拟合到数据中以检测过渡。

数据集由几千个点组成,包含1-10个细分,而我知道细分的数量。

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

在此处输入图片说明


我认为除非您告诉我们您想知道断点的位置的精度,对线性段的最短长度的猜测是多少以及典型样本中有多少个样本,否则无法合理地回答此问题。过渡区。如果图中的水平轴标签是样本编号,则在从x [ 0 ]的范围内进行两次转换时,任务要比直线段的持续时间更长(在样本)。x[5]x[0]
Dilip Sarwate 2012年

@DilipSarwate我用要求更新了问题(x轴是特斯拉中的磁场)
P3trus 2012年

如果您正在使用MATLAB 曲线拟合工具箱,
Rhei 2015年

Answers:


12

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

    RANSAC,应该是一种强大的拟合机制。在多个段之间停止算法很容易。但是,至少通过简单的实现,可能很难在段之间实现连续性(如您的应用程序所要求的)。作为概念验证,我从数据点创建一个图像,使得在我可以使用可用的RANSAC发动机,数学的线检测功能。ImageLines

在此处输入图片说明

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

在此处输入图片说明


看起来是个不错的答案。感谢您的贡献。
杰森R

7

X[ñ]

  • X[ñ]ÿ[ñ]

    ÿ[ñ]={1个如果 |X[ñ+1个]-X[ñ]-X[ñ]-X[ñ-1个]|<ϵ0除此以外。
    ϵX[ñ-1个]X[ñ]X[ñ+1个]ñ-1个X[ñ-1个]ñX[ñ]ñX[ñ]ñ+1个X[ñ+1个]
  • ÿ[ñ]1个01个1个ϵ

  • ÿ[ñ]X[3]X[88]X[94]X[120]X[129], 等等。向右延伸A和向左延伸B找出它们相交的位置;向右扩展B和向左扩展C以找出它们相交的位置,等等。恭喜,您现在有了一个连续且分段的线性模型来存储数据。


完全偷走了我的答案!=)
声子

有趣的想法,但可悲的是由于信号上的噪音,我没有得到好的结果。
P3trus 2012年

1
实际上,将表达式与ε进行比较的表达实际上是数据的二阶导数的近似值。还有其他方法可以使用三个以上的点来计算噪声,而这些点对噪声的响应不大。查找Savitzky-Golay。
DarenW

4

(几年后)分段线性函数是次数为1的样条曲线,可以告诉大多数样条曲线拟合器。 例如,scipy.interpolate.UnivariateSpline可以使用k=1 和一个平滑参数运行s,您必须使用它和平滑参数-参见 scipy-interpolation-univariate-splines
在Matlab中,查看 如何选择结

补充:找到最佳结并不容易,因为可能存在许多局部最优值。取而代之的是,给UnivariateSpline一个target s,误差之和为^ 2,然后让它确定结数。拟合后,get_residual()将获得误差的实际总和^ 2和get_knots()结。微小的变化s可能会大大改变结,特别是在高噪声-ymmv中。
该图显示了针对各种的随机分段线性函数+噪声的拟合s

有关分段常数的拟合,请参见“ 步长检测”。可以用于pw linear吗?不知道 通过区分嘈杂的数据开始会增加噪声,这是错误的。

其他测试功能和/或与论文或代码的链接也将受到欢迎。几个链接:
以节为参数的分段线性回归
线性样条线对结的放置位置非常敏感,
用于三次回归样条线的结选择
这是一个棘手的问题,大多数人只是通过反复试验来选择结。
越来越流行的一种方法是使用惩罚回归样条。


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)

动态编程非常聪明,但是可以胜任蛮力+启发式方法吗?
参见麻省理工学院6.006分校的Erik Demaine 撰写的出色课程笔记, 算法简介以及
google 分段线性回归和
John Henry综合征。


在此处输入图片说明


至少在科学上,问题在于结的位置。scipy使用等距结。
P3trus 2013年

@ P3trus,是的,是的开始,但是他们可以移动-参见情节。无论如何,它的目标是总误差,而不是节。
丹尼斯

@ P3trus您是否尝试过使用多元回归样条方法自动迭代选择断点?cs.rtu.lv/jekabsons/regression.html
Atul Ingle

@Atul Ingle,无论样条线钳工如何,afaik断点/结选择都是相同的问题。如果您从R /回归人员那里了解到用于该算法的不同算法,是否可以发布链接?
丹尼斯

是否正在R / Matlab中寻找可做自适应回归样条的软件包?此处:cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html以及我已经发布了链接的Matlab中的ARESLab。
Atul Ingle 2013年

0

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


导数可能很吵。我不认为我会推荐。
罗伯特·布里斯托

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.