Как определить точки разрыва в числовом массиве в MATLAB

Добрый день ребята, у меня новый вопрос, я надеюсь, что вы можете помочь мне:

У меня есть вектор, который вы можете найти в следующей ссылке:

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

вектор на графике выглядит следующим образом:

enter image description here

Как вы можете видеть, на графике есть некоторые части, где данные имеют поведение почти линейное. Вот о чем я говорю. о компании:

enter image description here

Мне нужно найти эти точки разрыва, основанные на линейности некоторых частей данных. И вы, вероятно, спросите себя, что происходит, когда часть данных не линейна, ну, алгоритм не будет принимать эту часть.

Я надеюсь, что вы можете помочь мне, спасибо.

1 ответов


то, что вы пытаетесь сделать, называется кусочно-линейной сегментацией временных рядов.

существует множество методов решения этой проблемы, которые отличаются своей сложностью и точностью.

вот самый простой, называемый сегментацией скользящего окна:

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 вот реализация простой алгоритм линейной регрессии.

в моем примере я использовал максимальную абсолютную ошибку в качестве критерия остановки, но вы можете замените его любой другой функцией установки, например среднеквадратичной ошибки.

вот пример сегментирования ваших данных с помощью max_error = 0.04:

segmentation results

вы можете найти больше об этом и других методах сегментации в этот обзор.