2013-07-04 10 views
2

내 프로젝트에서 알고리즘으로 계산 된 20.000 점의 표면이 있습니다. 이 알고리즘은 때로는 작은 영역에서 1 개 이상의 점을 잘못 계산하여 오류가 발생합니다.균질 표면에서 잘못된 점을 감지하십시오.

이 오류는 알고리즘에서는 해결할 수 없지만 나중에 검색해야합니다.

오류는 다음 그림에서 볼 수

:

enter image description here

당신이 볼 수 있듯이이 잘못뿐만 아니라 전체 균일 한 표면을 나누기뿐만 아니라의 aestetics을 파괴한다는 계산 된 포인트가 플롯 (프로젝트에서도 중요 함)

때로는 포인트 이상일 수 있지만 일반적으로 5 또는 6을 초과 할 수 없습니다. 오류는 항상 Z 축이므로 X 및 Y를 확인할 필요가 없습니다

I 이 poitns를 감지하기 위해 약간의 "일반적인"알고리즘을 찾기 위해 내 마음을 압박하고있다. 아마도 나는 표면의 패치를 취하고 Z를 의미하는 것을 추측하고, 그 다음 분산의 포인트를 찾아 낼 것입니다 ...하지만 나는 그것이 항상 작동 할 것이라고 생각하지 않습니다.

아이디어가 있으십니까?

참고 : 나는 누군가가 나를 위해 단지 아이디어를 코드를 작성 싶지 않다.

PD 다음 avobe 이미지에 대한 관련 코드는 : 귀하의 기능 이후

[x,y] = meshgrid([-2:.07:2]); 
Z = x.*exp(-x.^2-y.^2); 
subplot(1,2,1) 
surf(x,y,Z,gradient(Z)) 
subplot(1,2,2) 
Z(35,35)=Z(35,35)+0.3; 
surf(x,y,Z,gradient(Z)) 

답변

2

는 이러한 급격한 변화는 파생 상품을 조사하여 검출 할 수 원활하게 달라질 것으로 보인다. 당신은

  1. 한 방향
  2. 계산은 표준 편차의 특정 다수에 의해 평균에서 더 있습니다 포인트를 찾아 포인트를 찾아 의미 파생
  3. 의 표준 편차의 유도체를 취할 수 있습니다.

여기에 어쩌면 (10)의 임계 값이 괜찮습니다, 두 번째 피크는 약 1.9528에있는 동안 당신이 주변에 21.7에서 피크 V이 플롯을 얻을 귀하의 예를 들어 코드

U=diff(Z); 
V=(U-mean(U(:)))/std(U(:)); 
surf(x(2:end,:),y(2:end,:),V) 
V=[zeros(1,size(V,2)); V]; 
V(abs(V)<10)=0; 
V=sign(V); 
W=cumsum(V); 
[I,J]=find(W); 
outliers = [I, J]; 

입니다. enter image description here

하고 코드를 실행하는 다음 잘못이 서로 cumsum의 필요성 당신이 포인트의 패치를 가지고있는 경우입니다

outliers = 

    35 35 

반환합니다.

+0

이것은 꽤 좋은 것처럼 보인다. 아프지 만 다시 시도하자. –

+1

좋은 답변이지만 'cumsum'은 동일한 열에 두 개의 연속 된 특이 값으로 작동하지 않습니다. 또한 '10 '은 다소 임의적입니다. 적어도 '3'은 p 값 ~ 0.001에 해당하는 표준 숫자입니다. OP를위한 수동 프로세스 인 경우이 번호를 항상 변경하여 더 많거나 적은 이상 치를 찾을 수 있습니다. – Bee

+0

동일한 열에서 두 개의 연속 된 특이 값에 대해 정상적으로 작동합니다. 'Z (35,36,35) = Z (35 : 36,35) +0.3;을'Z (35 : 36,35) + 0.3으로'변경하고 테스트하십시오. –

3

표준 트릭은 Laplacian을 사용하여 가장 큰 특이 치를 찾는 것입니다. (이것은 Mohsen이 대답 한 것과 다르지 않지만 실제로는 조금 쉽습니다.) conv2로도 할 수 있습니다. 따라서 매우 효율적입니다.

아이디어를 구현하는 데 몇 가지 방법을 제공 할 수 있습니다. 간단한 방법은 File Exchange에서 찾을 수있는 gridfit 도구를 사용하는 것입니다.(Gridfit은 본질적으로 평활화 작업을 위해 Laplacian을 사용합니다.) 모든 점을 포함시킨 채로 표면을 맞추고, 가장 큰 영향을받은 단일 점을 찾습니다. 제외하고 다시 적합성을 재검토하고 다시 최대의 이상치 값을 찾습니다. (gridfit을 사용하면 가중치를 사용하여 가중치를 제로 가중치, 포인트 또는 포인트 목록을 제외하는 간단한 방법으로 제공 할 수 있습니다.) 필요한 최대 섭동이 충분히 작 으면 프로세스를 중지 할 수 있습니다. 좋은 점은 gridfit이 outlier에 대한 새로운 값을 전가하여 모든 구멍을 채우는 것입니다.

두 번째 접근법은 필터링 접근 방식에서 직접 Laplacian을 사용하는 것입니다. 여기에서 왼쪽, 오른쪽, 위 및 아래의 각 이웃의 평균 인 각 지점에서 값을 간단히 계산합니다. 계산 된 평균과 불일치하는 가장 큰 단일 값은 새로운 값으로 대체됩니다. 또는 새 값의 가중 평균을 이전 값과 함께 사용할 수 있습니다. 다시 말하지만, 프로세스가 어떤 허용 오차보다 큰 것을 생성하지 않을 때까지 반복합니다. (이것은 포트란 IMSL 라이브러리에서 회상 한 오래된 아웃 라이어 탐지 및 수정 계획의 기초이지만, 대략 30 년 전으로 거슬러 올라간다.)

+0

그래서 라플라시안의 제안은 deff (Z) 대신 del2 (Z)를 사용하는 것입니다. 맞습니까? 그건 좀 더 논리적 인 것 같습니다. –

+0

+1 : Laplacian은 더 좋고 더 견고한 접근 방법입니다. 매일 새로운 것을 배울 수 있습니다 :-) –

+1

예. "매끄러운"표면은 어디에서나 del^2가 작아야합니다. –