如何在MATLAB中识别数值数组中的断点

lis*_*jim 6 matlab data-analysis adjustment

大家下午好,我有这个新问题,希望你能再次帮助我:

我有一个矢量,您可以在下一个链接中找到:

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

绘制的矢量看起来像这样:

在此输入图像描述

如您所见,图中的某些部分数据的行为几乎是线性的.这就是我在说的:

在此输入图像描述

我需要的是根据数据中某些部分的线性来找到那些断点.你可能会问自己,当数据的一部分不是线性的时候会发生什么,好吧,算法不会采用那个部分.

我希望你能帮助我,谢谢.

Leo*_*tny 7

您要做的是称为分段线性时间序列分割.

解决这个问题有很多方法,它们的复杂性和准确性各不相同.

这是最简单的一个,称为滑动窗口分割:

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
Run Code Online (Sandbox Code Playgroud)

linear_regresion这是一个简单的线性回归算法的实现.

在我的例子中,我使用最大绝对误差作为停止标准,但您可以用任何其他拟合函数替换它,例如均方误差.

以下是使用以下内容细分数据的示例max_error = 0.04:

细分结果

你可以找到更多关于这个和其他的分割技术本次调查文件.