Как определить точки разрыва в числовом массиве в MATLAB
Добрый день ребята, у меня новый вопрос, я надеюсь, что вы можете помочь мне:
У меня есть вектор, который вы можете найти в следующей ссылке:
https://drive.google.com/file/d/0B4WGV21GqSL5Y09GU240N3F1YkU/edit?usp=sharing
вектор на графике выглядит следующим образом:
Как вы можете видеть, на графике есть некоторые части, где данные имеют поведение почти линейное. Вот о чем я говорю. о компании:
Мне нужно найти эти точки разрыва, основанные на линейности некоторых частей данных. И вы, вероятно, спросите себя, что происходит, когда часть данных не линейна, ну, алгоритм не будет принимать эту часть.
Я надеюсь, что вы можете помочь мне, спасибо.
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
:
вы можете найти больше об этом и других методах сегментации в этот обзор.