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

一种方法是检测导数中的步长(diff),但这将需要滤波,估计阈值,并可能给出模糊性。
我目前的方法是使用fminbnd和polyfit,但我想知道是否有更好的或更直接的方法来做到这一点:
% 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上运行,请评论
发布于 2020-11-06 18:57:04
我尝试给出一种方法的简短概述,该方法在运行时和健壮性方面可能比OP的建议更好。我建议使用健壮的polyfit,例如,在具有正态polyfit的循环中使用Huber-k-估计器,通过具有共同统计分布宽度的残差来选择数据点。因为估计器提供了分布宽度,所以可以使用它来稳健地选择接近直线拟合的点,这些点符合像残差< 6*sigma这样的标准。
使用此基本算法在完整数据集上拟合第一条线将给出与两条线段中较长的线段相匹配的结果。
通过第二次调用robust fit,只使用第一次fit拒绝的数据点,您将获得第二条线段的参数。
https://stackoverflow.com/questions/46356884
复制相似问题