2014-07-21 12 views
6

Các bạn buổi chiều tốt, tôi có câu hỏi mới này, tôi hy vọng bạn có thể giúp tôi lần nữa:Cách xác định các điểm vi phạm trong một mảng số trong MATLAB

Tôi có một véc tơ mà bạn có thể tìm thấy trong liên kết tiếp theo :

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

Các vector vẽ trông như sau:

enter image description here

như bạn có thể thấy, có một số phần trong biểu đồ nơi dữ liệu có hành vi gần như tuyến tính. Đây là những gì tôi đang nói về:

enter image description here

Những gì tôi cần là tìm những điểm vi phạm có trụ sở tại tuyến tính của một số bộ phận trong dữ liệu. Và bạn có thể tự hỏi mình, điều gì xảy ra khi phần dữ liệu không tuyến tính, tốt, thuật toán sẽ không lấy phần đó.

Tôi hy vọng bạn có thể giúp tôi, cảm ơn.

+6

Tính đạo hàm bậc hai (thay đổi độ dốc) bằng cách sử dụng ['diff'] (http://www.mathworks.com/help/matlab/ref/diff.html) và xem khi nào nó vượt quá ngưỡng nhất định (lý tưởng 0, nhưng tùy thuộc vào cách dữ liệu ồn ào như thế sẽ không xảy ra). – excaza

+5

Và áp dụng một bộ lọc lowpass ở một số giai đoạn để mịn kết quả, nếu không đạo hàm thứ hai sẽ chứa nhiều "tiếng ồn" –

Trả lời

7

Điều bạn đang cố gắng thực hiện được gọi là Phân đoạn chuỗi thời gian tuyến tính Piecewise.

Có rất nhiều phương pháp để giải quyết vấn đề này khác biệt theo độ phức tạp và độ chính xác của chúng.

Dưới đây là đơn giản nhất, được gọi là trượt Phân khúc cửa sổ:

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 đây là một thực hiện simple linear regression algorithm.

Trong ví dụ của tôi, tôi đã sử dụng lỗi tuyệt đối tối đa làm tiêu chí dừng, nhưng bạn có thể thay thế nó bằng bất kỳ chức năng phù hợp nào khác, ví dụ: mean squared error.

Dưới đây là một ví dụ về phân đoạn dữ liệu của bạn với max_error = 0.04:

segmentation results

Bạn có thể tìm thêm về vấn đề này và các kỹ thuật phân chia nhỏ khác trong this survey paper.

+0

Tôi không thể làm cho nó tốt hơn, THALLKS THẬT! – lisandrojim

Các vấn đề liên quan