2014-07-21 3 views
6

좋은 오후의 사람을 파괴 점을 확인하는 방법 나는이 새로운 질문이, 나는 다시 나를 도울 수 있기를 바랍니다 :MATLAB에서 숫자 배열에

난 당신이 다음 링크에서 찾을 수있는 벡터를 가지고 :

enter image description here

당신이 볼 수 있듯이 :

https://drive.google.com/file/d/0B4WGV21GqSL5Y09GU240N3F1YkU/edit?usp=sharing

이 벡터는이 같은 모습을 그려 그래프에는 데이터가 거의 선형적인 동작을하는 부분이 있습니다. 이 내가 무슨 말을하는지입니다 :

enter image description here

내가 필요한 것은 데이터에서 일부의 선형성을 기반으로하는 브레이크 포인트를 찾는 것입니다. 그리고 아마도 데이터의 일부가 선형이 아니고 알고리즘이 그 부분을 차지하지 않을 때 무슨 일이 일어날 지 물어볼 것입니다.

감사합니다. 감사드립니다.

+6

[diff'] (http://www.mathworks.com/help/matlab/ref/diff.html)을 사용하여 2 차 미분 (기울기 변화)을 계산하고 특정 임계 값을 이상적으로 0이지만 데이터가 얼마나 시끄러운 지에 따라 다릅니다). – excaza

+5

그리고 결과를 부드럽게하기 위해 어떤 단계에서 로우 패스 필터를 적용하십시오. 그렇지 않으면 2 차 미분이 많은 "노이즈"를 포함하게됩니다. –

답변

7

당신이하려고하는 것을 Piecewise Linear Time Series Segmentation이라고합니다.

복잡성과 정확도가 다른이 문제를 해결하는 데는 여러 가지 방법이 있습니다. 여기

창 분할 슬라이드라는 간단한 일이다 : 여기

function [breaks vals] = segment(data, max_error) 
    breaks = []; 
    vals = []; 
    left = 1; 
    for right = 2:length(data) 
     err = linear_regresion(data(left:right)); 
     if max(abs(err)) > max_error 
      breaks(end+1) = right-1; 
      vals(end+1) = data(right-1); 
      left = right; 
     end 
    end 
end 

function err = linear_regresion(data) 
    n = length(data); 
    x = (1:n)' - (n+1)/2; 
    y = data - mean(data); 
    k = sum(x.*y) ./ sum(x.^2); 
    err = y - k*x; 
end 

linear_regresionsimple linear regression algorithm가 구현된다.

예를 들어 최대 절대 오류를 중지 기준으로 사용했지만 다른 피팅 함수로 바꿀 수 있습니다. mean squared error. 당신은 this survey paper이 다른 분할 기술에 대한 자세한 내용을 확인할 수 있습니다

segmentation results

: 여기

max_error = 0.04하여 데이터를 분할의 예입니다.

+0

정말 더 좋았습니다. 정말 감사합니다! – lisandrojim