我尝试使用稳健的方法将两条相连的线路连接到噪声数据,目标是找到互连(下图中的垂直虚线红线)。
一种方法是检测导数(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上运行,请发表评论
答案 0 :(得分:0)
我尝试给出一种简短的方法概述,该方法在运行时和鲁棒性方面可能比OP的建议更好。我建议使用稳健的polyfit,例如在具有正常polyfit的循环中使用Huber-k估计器,以按残差选择具有共同统计分布宽度的数据点。
由于估算器提供了分布宽度,因此可以使用残差<{6*sigma
之类的标准来稳健地选择接近直线拟合的点。
使用此基本算法在整个数据集上进行第一行拟合将为您提供匹配两个线段中较长者的结果。
第二次仅使用第一次拟合所拒绝的数据点调用稳健拟合,您将获得第二条线段的参数。