您尝试做的是分段线性时间序列分割。
有很多方法可以解决这个问题,它们的复杂性和准确性各不相同。
这是最简单的一种,称为滑动窗口分割:
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
这是一个简单的线性回归算法的实现。
在我的示例中,我使用最大绝对误差作为停止标准,但您可以将其替换为任何其他拟合函数,例如mean squared error。
以下是使用 分割数据的示例max_error = 0.04
:

您可以在本调查报告中找到更多关于此和其他分割技术的信息。