你想要做的就是分段線性時間序列分割。
有很多方法來解決這個問題,它們的複雜性和準確性不同。
這是最簡單的一種,稱爲滑動窗口分割:
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。
使用['diff'](http://www.mathworks.com/help/matlab/ref/diff.html)計算二階導數(斜率的變化),並查看它何時超過某個閾值(理想情況下0,但取決於數據的嘈雜程度,情況並非如此)。 – excaza
並在某個階段應用低通濾波器來平滑結果,否則二階導數將包含很多「噪音」 –