大家下午好,我有这个新问题,希望你能再次帮助我:
我有一个矢量,您可以在下一个链接中找到:
https://drive.google.com/file/d/0B4WGV21GqSL5Y09GU240N3F1YkU/edit?usp=sharing
绘制的矢量看起来像这样:
如您所见,图中的某些部分数据的行为几乎是线性的。这就是我所说的:
我需要的是根据数据中某些部分的线性来找到那些断点。你可能会问自己,当数据的一部分不是线性的时候会发生什么,好吧,算法不会采用那个部分。
我希望你能帮助我,谢谢。
答案 0 :(得分: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
linear_regresion
此处是simple linear regression algorithm的实现。
在我的示例中,我使用最大绝对误差作为停止标准,但您可以将其替换为任何其他拟合函数,例如mean squared error
以下是使用max_error = 0.04
分割数据的示例:
您可以在this survey paper中找到有关此分割技术和其他分割技术的更多信息。