2015-01-05 2 views
2

다른 사람이이 점들을 대다수 (20 점 만점에 5 ~ 6 점이 될 수 있음)를 통과 한 주어진 점 집합으로부터 완벽한 직선을 그리는 방법을 알아낼 수 있습니까? 이것은 선이 맞지 않는 문제이지만, 주어진 점의 대부분 사이에 완벽한 선을 그려야합니다 (수평, 수직 또는 약간 기울어 져 있음). 여기 MATLAB에서 주어진 점의 대부분을 통과하는 완벽한 직선을 그리는 방법은 무엇입니까?

는 MATLAB 코드 :

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]; 
 

 
figure;scatter(f, e, 5, 'red'); 
 

 
axis ij;

여기 이미지는 다음과 같습니다 enter image description here

+3

참고 : 한정된 정밀도를 다루기 때문에 어떤 공차를 선언하지 않는 한 2 점이 넘지 않을 가능성이 가장 큽니다 –

+1

RANSAC 또는 Hough 변형을 보았습니까? – Shai

+1

적합 문제가 아닌 이유가 있습니까? 당신은 라인이 대부분의 포인트를 통과하기를 원한다고 말합니다. 나에게 맞는 문제 같아 ...? – kkuilla

답변

4

대다수의 점을 지나치게하기를 원하기 때문에, 말하지 않더라도 라인 피팅 문제와 비슷하게 들립니다. 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 알고리즘을 사용하는 것이 좋습니다. Line Fit Example

+0

그림을 추가하면 좋을 것입니다. – kkuilla

+0

Theil-Sen 추정기가 작동하는 것처럼 보입니다. 그러나이 데이터에 대한 결과를 얻을 수 없습니다. 다시 확인해 볼게. 극단적 인 코드는 해결책이 아닙니다. – erbal

+0

Theil-Sen 추정기는 열 벡터를 입력으로 허용하기 때문에,'[m, e0] = Theil_Sen_Regress (f ', e')'를 사용해야합니다. – hugovdberg

2

매우 효율적 쉽게하지만 솔루션은 각각의 두 점 사이의 기울기를 계산하는 것 및 한 세트의 점이 직선 상에 놓여 있다면,이 두 세트의 모든 쌍은 같은 기울기를 가질 것입니다. 그래서 하나의 알고리즘은 모든 포아를 같은 기울기로 선택하고 공통점이 하나 인 경우 연결합니다. 마침내 가장 큰 세트를 선택해야합니다. 이 알고리즘의 시간 복잡도는 O (N^2 log N)이며, N은 점의 수입니다. 그림에서 알 수 있듯이 모든 포인트를 통과하는 실제 완벽한 라인이 아니라이 알고리즘에서 두 쌍을 연결하는 기준으로 정의 할 수있는 허용 오차가 있습니다. 두 개의 기울기가 2 % 미만 차이가 나는 경우 쌍을 연결합니다.

+1

이것은 필자의 대답에서 언급 한 Theil-Sen 추정기에 매우 가깝습니다.이 추정기는 가장 잘 맞는 선의 기울기와 y 교차를 결정합니다. – hugovdberg

3

그 내용은 RANSAC algorithm의 교본입니다. Matlab의 This free toolbox에는 실제로 아주 잘 맞는 라인 피팅 예제가 있습니다.

+0

github 링크가 작동하지 않습니다. – erbal

+0

은 나에게 도움이된다 ... 어떤 식 으로든 위와 같은 툴박스가 많고 Wikipedia 기사에도 구현되어있다. http://en.wikipedia.org/wiki/RANSAC#Matlab_Implementation – McMa

+0

조사 할 수 없다. RANSAC, Extrema가 나를 위해 일했던 것처럼. – erbal

관련 문제