什么是拟合分段线性但噪声数据的稳健方法?
我正在测量一个信号,它由几个几乎线性的段组成。我想自动地将几行数据拟合到数据中以检测转换。
数据集由几千个点组成,有 1-10 个段,我知道段的数量。
这是我想自动执行的示例。
什么是拟合分段线性但噪声数据的稳健方法?
我正在测量一个信号,它由几个几乎线性的段组成。我想自动地将几行数据拟合到数据中以检测转换。
数据集由几千个点组成,有 1-10 个段,我知道段的数量。
这是我想自动执行的示例。
我天真地尝试了两种方法(仅使用 3 段)。肯定会有更好的方法。
我并不声称以下方法是可靠的,但它可能对你有用。对于数千个点和可能有十个左右的直线段,请按以下步骤进行。
处理点以创建位数组,如下所示。 这里与直线的接近程度的概念到。行家将认识到该标准要求通过和 )的直线具有几乎相同的斜率和。
如果 s的 10 条左右的长行程组成的数组,这些行程 s 的行程隔开,偶尔会到处散落 s 来破坏美丽,放松,你走在正确的轨道上。秒的运行太少或太多重复上一步。
使用线性最小均方误差曲线拟合将直线拟合到由标识为属于同一直线段的点。您现在有十个直线拟合点,例如 Line A 拟合点到;线 B 适合点到,线 C 适合点到,依此类推。向右扩展 A 向左扩展 B 以找出它们相交的位置;向右扩展 B 和向左扩展 C 以找出它们相交的位置等。恭喜,您现在拥有数据的连续分段线性模型。
(多年后)分段线性函数是 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这是一个棘手的问题,并且大多数人只是通过反复试验来选择结。一种越来越流行的方法是使用惩罚回归样条曲线。
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 交点,这在那时应该是微不足道的。