2014-07-21 18 views
6

下午好,大家好,我有這樣的新的問題,我希望你能再次幫助我:如何在數字數組在MATLAB找出突破點

我有一個載體,它可以在下一環節發現:

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

矢量繪圖看起來像這樣:

enter image description here

正如你所看到的,圖中有一些部分數據的行爲幾乎是線性的。這就是我說的:

enter image description here

我需要的是找到基於在數據某些部分的線性的突破點。而且你可能會問自己,當部分數據不是線性的時候會發生什麼,那麼算法就不會採用這個部分。

我希望你能幫助我,謝謝。

+6

使用['diff'](http://www.mathworks.com/help/matlab/ref/diff.html)計算二階導數(斜率的變化),並查看它何時超過某個閾值(理想情況下0,但取決於數據的嘈雜程度,情況並非如此)。 – excaza

+5

並在某個階段應用低通濾波器來平滑結果,否則二階導數將包含很多「噪音」 –

回答

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細分數據的例子:

segmentation results

你可以找到更多關於這個和其他分割技術在this survey paper

+0

我無法讓它變得更好,真的感謝! – lisandrojim

相關問題