2012-05-16 3 views
0

구조로 구성된 데이터 세트가 있습니다. 나는 다수의 센서를 가지고 있으며, 각각 a부터 d까지의 4 가지 값을 가지고 있으므로 구조 DD.sensorID, D.a, D.b, D.cD.d을 포함합니다. 나는 판독 값의 분포에서 특이 치를 찾고 있습니다. 나는 데이터를 플로팅 제한을 선택하고 배열이 제한 이외의 수치와 sensorID 년대를 식별하고이를 저장하는 스크립트를 작성했습니다 :데이터 아웃 라이어 식별

aMax = 5; 
    aHighIndices = find(D.a>aMax); 
    aMin = 0; 
    aLowIndices = find(D.a<aMin); 
    aHighLength = size(aHighIndices); 
    for i = 1:aHighLength 
    A_hi(i) = D.sensorID(aHighIndices(i)); 
    end 

이 반복된다 a_Hi, a_Low, b_Hi, 등 . 그리고 내가 함께 결과를 패치 :이 작업을 수행하는 더 간결한 방법은

outliers = [A_hi; A_low; B_low; B_hi; C_low; C_hi; D_low; D_hi];

있습니까? 높은 특이점을 찾기 위해 한번에 낮은 아웃 라이어를 찾기 위해 한번 :

+0

방법론이 좋아 보입니다. 특이점을 찾는 다른 방법을 찾고 있다면 다른 방법이 있습니다. 각 센서의 평균 판독 값을 중심으로 2D 가우스를 생각해보십시오. 특정 센서 판독 값이 두 표준 편차가되면 아마도 이상 값으로 간주 할 수 있습니다. 이제 각 센서 주위에 고/저 임계 값을 설정하는 대신 각 센서에 법선을 맞추고 한 임계 값을 정의해야합니다. 즉, 한 포인트가 고려되기 전에 평균에서 몇 표준 편차가 떨어져 있어야합니다 이상 치. – kitchenette

답변

3

1은 두 번 find와 판독 각 어레이 ( 벡터)을 반복.

a_outlier_indices = find(D.a < aMin | D.a > aMax); 

2 또 다른 일을 : 당신은에 의해 단순히 하나 개의 반복에서 그것을 할 수 MATLAB에서 for 오히려 비용이 일반적으로 동일한 결과를 생성하는 MATLAB 문법의 기본 능력을 사용해보십시오 . 구체적으로는, MATLAB는 지표 벡터를 이용하여 다른 벡터로부터 서브 벡터를 추출 할 수 :

a_outliers = D.sensorID(a_outlier_indices); 

단순히 지수의 벡터 D.a 공급

이상치 원하는 벡터를 산출한다. 또한

3. , 좋은 습관에 대한 조언 : 대신 별도의 배열 벡터의 셀 어레이에 d을 통해 배열 a를 저장 고려, 같은 : 내 예 D.readings = {a, b, c, d} 및 정의 해당 임계 값 셀 어레이 (thr), 그래서 당신은 루프를 사용하여 일부 코드를 저장할 수 있습니다

thr = {[aMin, aMax]; [bMin, bMax]; [cMin, cMax]; [dMin, dMax]} 
outliers = cell(4, 1); 
for i = 1:4 
    outlier_indices = find(D.readings{i} < thr{i}(1) | D.readings{i} > thr{i}(2)); 
    outliers{i} = D.sensorID(outlier_indices); 
end 

이제 셀 어레이 outliers 모든 것을해야합니다. 이상 값이 outliers{1} 사용하는 에 액세스하려면 내부의 간단한 연결하여 하나 개의 벡터로 ... 등등 당신은 (질문처럼) 함께 코스 패치 모든 것을 할 수

이상 값이 outliers{2}를 사용 B에 액세스하고 for 루프 : 대신 outliers{i} = ... 문의

outliers = [outliers, D.sensorID(outlier_indices)];

.

P.S

나는 최소/최대 임계 값을 사용하는 당신은 이상 값을 찾을 때 사용할 것입니다 있으리라 믿고있어. 이상치를 찾는 다른 방법이 있지만 그 결과가 달라집니다.