既然你想讓這條線穿過大多數的點,這聽起來就像是一個線條擬合問題,即使你說它不是。你是否看過Theil-Sen估計量(for example this one on fex),這是一個線性迴歸,忽略了大約30%的異常值。
如果您只是想通過極值線你可以做這樣的事情:
% Setup data
e = [161 162 193 195 155 40 106 102 125 155 189 192 186 188 185 186 147 148 180 183];
f = [138 92 92 115 258 124 218 114 125 232 431 252 539 463 643 571 582 726 726 676];
% Create scatterplot
figure(1);
scatter(f, e, 5, 'red');
axis ij;
% Fit extrema
[min_e, min_idx_e] = min(e);
[max_e, max_idx_e] = max(e);
[min_f, min_idx_f] = min(f);
[max_f, max_idx_f] = max(f);
% Determine largest range and draw line accordingly
if (max_e-min_e)>(max_f-min_f)
line(f([min_idx_e, max_idx_e]), e([min_idx_e, max_idx_e]), 'color', 'blue')
text(f(max_idx_e), e(max_idx_e), ' Extrema')
else
line(f([min_idx_f, max_idx_f]), e([min_idx_f, max_idx_f]), 'color', 'blue')
text(f(max_idx_f), e(max_idx_f), ' Extrema')
end
% Fit using Theil-Sen estimator
[m, e0] = Theil_Sen_Regress(f', e');
line([min_f, max_f], m*[min_f, max_f]+e0, 'color', 'black')
text(max_f, m*max_f+e0, ' Theil-Sen')
然而,正如你會發現沒有解決方案能夠自動自動適合的點,只是因爲有太多的異常值,除非你事先過濾這些。因此,使用Shai和McMa提出的RANSAC算法可能會更好。
注意:由於您處理的是有限精度,因此除非您聲明瞭一些容差 –
,否則您看過RANSAC或Hough變換的絕大多數機會不超過2個點將通過任何行? – Shai
有沒有任何理由爲什麼這不是一個合適的問題?你說你想讓這條線穿過大部分的點。聽起來像是一個適合我的問題...? – kkuilla