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

Posted

技术标签:

【中文标题】如何在 MATLAB 中识别数值数组中的断点【英文标题】:How to identify breaking points in a numeric array in MATLAB 【发布时间】:2014-09-12 09:13:29 【问题描述】:

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

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

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

绘制的矢量如下所示:

如您所见,图表中有一些部分的数据行为几乎是线性的。这就是我要说的:

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

希望你能帮助我,谢谢。

【问题讨论】:

使用diff 计算二阶导数(斜率的变化)并查看它何时超过某个阈值(理想情况下为 0,但取决于数据的噪声程度,情况并非如此) . 并在某个阶段应用低通滤波器以平滑结果,否则二阶导数将包含很多“噪声” 【参考方案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 这里是simple linear regression algorithm 的实现。

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

以下是使用max_error = 0.04 分割数据的示例:

您可以在this survey paper 中找到有关此分割技术和其他分割技术的更多信息。

【讨论】:

我无法让它变得更好,非常感谢!

以上是关于如何在 MATLAB 中识别数值数组中的断点的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中的ga算法,如何如何获得每一步计算数值

如何在MATLAB中把一个一个的数值放进数组中

matlab中如何看函数结构体中的数据

matlab如何将字符串数组转化成数值型数组??

如何在二维数组的每个单元格中找到具有相同数值的行?

matlab中,如何加快数据运算速度?