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

标签 matlab data-analysis adjustment

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

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

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

绘制的向量如下所示:

enter image description here

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

enter image description here

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

希望您能帮帮我,谢谢。

最佳答案

您尝试做的是分段线性时间序列分割。

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

这里是最简单的一种,叫做滑动窗口分割:

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_regression 这里是 simple linear regression algorithm 的一个实现.

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

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

segmentation results

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

关于matlab - 如何在 MATLAB 中识别数值数组中的断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872314/

相关文章:

algorithm - Matlab Bpm算法

python - 我想提取 cx、cy、r 的值,它们都位于第 3 列中

c# - 使用 Aforge.net 或 c# 执行类似于 Photoshop 自动色调的操作

php - 更正 MySQL 中的日期和时间列

matlab - 如何改变 matlab 图(如颜色图)的线条颜色?

python - Python 中的多元线性回归 - MATLAB 中 mvregress 的模拟?

matlab - 是否可以将嵌套包导入 matlab 函数

python - 显示来自数据框不同列的堆积条形图的每种颜色的值

python - 在 pandas 中将时间序列数据与元数据相结合的正确方法是什么?

在C中创建右偏二叉树