我正在测量一个信号,该信号由几个几乎线性的段组成。我想对数据进行原子拟合以检测过渡。
数据集由几千个点组成,具有1-10个细分,我知道细分的数量。 >
这是我要自动执行的操作的示例。
#1 楼
我天真地尝试了两种方法(仅使用3个细分)。肯定会有更好的方法。RANSAC,应该是一种可靠的拟合机制。在多个段之间停止算法很容易。但是,至少在一个简单的实现中,可能很难在段之间实现连续性(如您的应用程序所要求的)。
作为概念证明,我从数据点创建了图像,以便可以使用Mathematica的行检测功能$ ImageLines $中可用的RANSAC引擎。
使用通用最小化器拟合分段线性模型。强制执行段连续性很容易。有趣的是,测试残差和其他属性可能会提供足够的信息来自动确定段数-尽管我没有尝试过。在Mathematica中就是这样:
评论
$ \ begingroup $
似乎是一个很好的答案。感谢您的贡献。
$ \ endgroup $
–Jason R
2012年1月26日13:51
#2 楼
我并不是说以下方法是可靠的,但是它可能对您有用。按如下所示处理点$ x [n] $以创建位数组$ y [n] $。
$$ y [n] = \ begin {cases } 1,&\文本{if}〜|(x [n + 1] -x [n])-(x [n] -x [n-1])| <\ epsilon,\\
0,&\ text {otherwise。} \ end {cases} $$
这里$ \ epsilon $是为适应您对
直线的接近程度而选择的一个小数字想要点$ x [n-1],x [n],x [n + 1] $砍到。
该准则将被Cognoscenti识别为要求通过$(n-1,x [n-1])$和$(n,x [n])$的直线几乎具有与通过$(n,x [n])$和$(n + 1,x [n + 1])$的直线相同的斜率。
如果$ y [n] $为一系列十个左右的$ 1 $ s奔跑,被
$ 0 $ s奔跑隔开,偶尔会有$ 1 $ s在这里和那里流逝,破坏美丽,
放松,您在正确的轨道上。否则,如果运行次数太少或太少
许多$ 1 $ s的运行次数,请使用不同的$ \ epsilon $重复上一步。
使用线性最小均方误差曲线拟合将直线
与$ y [n] $标识为属于同一直线段的点匹配。现在,您有十个直线拟合点,例如,线A拟合点$ x [3] $到$ x [88] $; B行使点$ x [94] $到点$ x [120] $,
线C使点$ x [129] $到点$ \ cdots $,依此类推。向右扩展A
和向左扩展B,以找出它们相交的位置;向右扩展B和向左扩展C,以找出它们相交的地方,等等。恭喜,您
现在已经有了一个连续且分段的线性模型来存储数据。
评论
$ \ begingroup $
完全偷走了我的答案! =)
$ \ endgroup $
– Phonon
2012年1月26日19:21
$ \ begingroup $
有趣的想法,但可悲的是,由于信号上的噪音,我没有得到很好的结果。
$ \ endgroup $
– P3trus
2012年1月28日下午6:11
$ \ begingroup $
将比拟的表达与epsilon进行比较的表达式实际上是数据的二阶导数的近似值。还有其他方法可以使用三个以上的点来计算,而这些点对噪声的响应不大。查找Savitzky-Golay。
$ \ endgroup $
– DarenW
2012年11月11日下午2:32
#3 楼
(几年后)逐段线性函数是1级样条,可以告诉大多数样条钳工。
scipy.interpolate.UnivariateSpline
例如可以与
k=1
/>和平滑参数s
,您必须使用它-请参阅scipy-interpolation-univariate-splines。
在Matlab中,请参阅
如何-to-choose-knots。
添加:查找最佳结并不容易,因为可能存在许多局部最优值。
相反,您给UnivariateSpline一个目标
s
,误差之和^ 2,让它确定结数。
安装后,
get_residual()
会得到实际的误差^ 2,和
get_knots()
会出现结。 。该图显示了对各种
s
的随机分段线性函数+噪声的拟合。关于分段常数的拟合,请参见
阶跃检测。
可以用于pw线性吗?不知道从区分嘈杂的数据开始
会增加噪声,这是错误的。
将欢迎其他测试功能和/或指向论文或代码的链接。
以下两个链接:分段线性回归,带有参数的结点
$ \ qquad $线性样条线对放置结点的位置非常敏感
$ \ qquad $这是一个棘手的问题,大多数人只是通过反复试验来选择结。
$ \ qquad $越来越流行的一种方法是使用惩罚回归样条。 />
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算法简介下
Google分段线性回归
/>还有约翰·亨利综合症。
评论
$ \ begingroup $
问题,至少在科学上是结的位置。 scipy使用等距结。
$ \ endgroup $
– P3trus
2013年9月17日上午8:49
$ \ begingroup $
@ P3trus,是的,但是首先他们可以移动-查看情节。无论如何,它的目标是总误差,而不是打结。
$ \ endgroup $
–丹尼斯
2013年9月18日在12:29
$ \ begingroup $
@ P3trus您是否尝试过使用多元回归样条方法自动迭代选择断点? cs.rtu.lv/jekabsons/regression.html
$ \ endgroup $
– Atul Ingle
13年10月13日在20:21
$ \ begingroup $
@Atul Ingle,afaik断点/结选择是同样的问题,无论花键装配工如何。如果您从R /回归人员那里了解到用于该算法的不同算法,可以发表一个链接吗?
$ \ endgroup $
–丹尼斯
13-10-25在10:11
$ \ begingroup $
是否正在R / Matlab中寻找可做自适应回归样条的程序包?此处:cran.r-project.org/web/packages/earth/index.html cran.r-project.org/web/packages/mda/index.html以及我已经发布了链接的Matlab中的ARESLab。
$ \ endgroup $
– Atul Ingle
13-10-30在23:28
#4 楼
取导数并寻找几乎恒定值的区域。您将需要创建算法来搜索理想情况下具有+/-斜度水平的那些区域,这将为您提供该部分的直线斜率。在进行截面分类之前,您可能需要进行一些平滑处理,例如滑动均值处理。下一步将是获取y交点,此时该点应该是微不足道的。评论
$ \ begingroup $
导数可能很吵。我不认为我会推荐。
$ \ endgroup $
–罗伯特·布里斯托-约翰逊
2014年3月10日在3:47
#5 楼
使用l1趋势过滤器是另一个想法:纸张
在线示例
评论
$ \ begingroup $
您的回答太短了,以至于没有建设性!请考虑以教学方式进行扩展。
$ \ endgroup $
–sansuiso
2014年4月30日在7:49
评论
我认为除非您告诉我们您想知道断点的位置的精度,对线性段的最短长度的猜测是多少以及典型样本中有多少个样本,否则无法合理地回答这个问题过渡区。如果图中的水平轴标签是样本编号,则在从$ x [-5] $到$ x [0] $的范围内进行两次过渡时,任务要比直线段为持续时间更长(以样本为单位)。@DilipSarwate我用要求更新了问题(x轴是特斯拉中的磁场)
如果您正在使用MATLAB曲线拟合工具箱,则可以尝试使用此工具箱