2014-07-21 16 views
6

bravi ragazzi pomeriggio, ho questa nuova domanda, spero che mi può aiutare di nuovo:Come identificare punti di rottura in una matrice numerica in MATLAB

Ho un vettore, che potete trovare nel link seguente :

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

Il vettore tracciati si presenta così:

enter image description here

Come si può vedere, ci sono alcune parti nel grafico in cui i dati hanno un comportamento quasi lineare. Questo è quello che sto parlando:

enter image description here

cosa ho bisogno è di trovare quei punti di rottura basati nella linearità di alcune parti nei dati. E probabilmente ti chiedi, cosa succede quando la parte dei dati non è lineare, beh, l'algoritmo non prenderà quella parte.

Spero che tu possa aiutarmi, grazie.

+6

Calcolare la derivata seconda (cambio della pendenza) utilizzando ['diff'] (http://www.mathworks.com/help/matlab/ref/diff.html) e vedere quando supera una certa soglia (idealmente 0, ma a seconda di quanto siano rumorosi i dati non sarà il caso). – excaza

+5

E applicare un filtro passa-basso ad un certo livello per uniformare i risultati, altrimenti la seconda derivata conterrà molto "rumore" –

risposta

7

Quello che stai cercando di fare è chiamato segmentazione in serie lineare a tempo parziale.

Esistono molti metodi per risolvere questo problema che differiscono per la loro complessità e precisione.

Qui è la più semplice, chiamato finestra scorrevole di segmentazione:

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 Ecco un'implementazione di simple linear regression algorithm.

Nel mio esempio ho usato l'errore assoluto massimo come criterio di arresto, ma è possibile sostituirlo con qualsiasi altra funzione di adattamento, ad es. mean squared error.

Ecco un esempio di segmentare i dati con max_error = 0.04:

segmentation results

È possibile trovare maggiori informazioni su questo e altri tecniche di segmentazione in this survey paper.

+0

Non riuscivo a renderlo migliore, REALMENTE GRAZIE! – lisandrojim