2014-07-21 13 views
6

dobry chłopaki, mam to nowe pytanie, mam nadzieję, że może mi znowu pomóc:Jak rozpoznać łamanie punktów w tablicy numerycznej w programie MATLAB

Mam wektor, który można znaleźć w kolejnym linku :

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

wektor wykreślono wygląda następująco:

enter image description here

Jak widać, na wykresie są pewne części, w których dane zachowują się niemal liniowo. To, co mówię:

enter image description here

Co potrzebne jest, aby znaleźć te łamanie punktów opartych na liniowości niektórych częściach w danych. I prawdopodobnie zastanawiasz się, co się dzieje, gdy część danych nie jest liniowa, dobrze, algorytm nie weźmie tej części.

Mam nadzieję, że możesz mi pomóc, dzięki.

+6

Oblicz drugą pochodną (zmianę nachylenia) za pomocą ['diff'] (http://www.mathworks.com/help/matlab/ref/diff.html) i zobacz, kiedy przekracza określony próg (najlepiej 0, ale w zależności od tego, jak głośne są dane, nie będzie to miało miejsca). – excaza

+5

Zastosuj filtr dolnoprzepustowy na pewnym etapie, aby wygładzić wyniki, w przeciwnym razie druga pochodna będzie zawierała dużo "szumu". –

Odpowiedz

7

To, co próbujesz zrobić, nazywa się Segmentacja szeregowo-liniowych szeregów czasowych.

Istnieje wiele metod rozwiązania tego problemu, które różnią się złożonością i dokładnością.

Oto najprostszy jeden, zwany przesuwne okno segmentacji:

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_regresion tutaj jest implementacją simple linear regression algorithm.

W moim przykładzie użyłem maksymalnego błędu bezwzględnego jako kryterium zatrzymania, ale można go zastąpić dowolną inną funkcją dopasowania, np. mean squared error.

Oto przykład segmentacji danych z max_error = 0.04:

segmentation results

można znaleźć więcej na ten temat i innych technik segmentacji w this survey paper.

+0

Nie mogłem zrobić tego lepiej, NAPRAWDĘ DZIĘKUJĘ! – lisandrojim

Powiązane problemy