首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将具有两条线的多边形拟合到噪声数据

问将具有两条线的多边形拟合到噪声数据
EN

Stack Overflow用户
提问于 2017-09-22 12:28:45
回答 1查看 147关注 0票数 1

我试图用一种健壮的方法将两条相连的线拟合到噪声数据中,目标是找到互连(下图中的垂直红线)。

​

​

一种方法是检测导数中的步长(diff),但这将需要滤波,估计阈值,并可能给出模糊性。

我目前的方法是使用fminbnd和polyfit,但我想知道是否有更好的或更直接的方法来做到这一点:

代码语言:javascript
复制
% create sample data
x = linspace (0, 3);
y = 1.37 * x;
r = x > 1.7;
y(r) = y(r) + (x(r) - x(find (r, 1))) * 4;
y = y + 0.2 * randn (size (y));

% plot it
plot (x, y)
grid on

function ret = d (s, x, y)
  assert (s <= 1.0 && s >= 0);
  k = round (s * numel (x));

  [~, s1] = polyfit (x(1:k), y(1:k), 1);
  [~, s2] = polyfit (x(k+1:end), y(k+1:end), 1);

  ret = s1.normr + s2.normr;
end

da = @(s) d(s,x,y);

[X, FVAL, INFO, OUT] = fminbnd (da, 0, 1)
xp = x(round (X * numel (y)))

line ([xp xp], [min(y) max(y)], 'linestyle', '--', 'color', 'red')

这段代码是为GNU Octave编写的,但我试图与MATLAB兼容。如果它不能在Matlab上运行,请评论

EN

回答 1

Stack Overflow用户

发布于 2020-11-06 18:57:04

我尝试给出一种方法的简短概述,该方法在运行时和健壮性方面可能比OP的建议更好。我建议使用健壮的polyfit,例如,在具有正态polyfit的循环中使用Huber-k-估计器,通过具有共同统计分布宽度的残差来选择数据点。因为估计器提供了分布宽度,所以可以使用它来稳健地选择接近直线拟合的点,这些点符合像残差< 6*sigma这样的标准。

使用此基本算法在完整数据集上拟合第一条线将给出与两条线段中较长的线段相匹配的结果。

通过第二次调用robust fit,只使用第一次fit拒绝的数据点,您将获得第二条线段的参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46356884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档