2017-04-12 35 views
1

在matlab中,我想要適合分段迴歸,並找到X軸上第一個變化點的位置。例如,對於以下數據,輸出可能是changepoint=20(我實際上不想繪製它,只需要更改點)。在matlab中進行分段迴歸,找到變化點

data = [1 4 4 3 4 0 0 4 5 4 5 2 5 10 5 1 4 15 4 9 11 16 23 25 24 17 31 42 35 45 49 54 74 69 63 46 35 31 27 15 10 5 10 4 2 4 2 2 3 5 2 2]; 
x = 1:52; 
plot(x,data,'.') 
+1

你有信號處理工具箱?如果你這樣做,你可以使用'findchangepts'在一行代碼中做到這一點。 – edwinksl

+0

omg這是驚人的@edwinksl非常感謝!你應該寫答案,以便我可以給你賞金:) – user2861089

+0

聽起來不錯,我只是寫了一個答案,並添加了一些小的細節。 – edwinksl

回答

2

如果有信號處理工具箱,你可以直接使用findchangepts功能(參見https://www.mathworks.com/help/signal/ref/findchangepts.html對於文件):

data = [1 4 4 3 4 0 0 4 5 4 5 2 5 10 5 1 4 15 4 9 11 16 23 25 24 17 31 42 35 45 49 54 74 69 63 46 35 31 27 15 10 5 10 4 2 4 2 2 3 5 2 2]; 
x = 1:52; 
ipt = findchangepts(data); 
x_cp = x(ipt); 
data_cp = data(ipt); 

plot(x,data,'.',x_cp,data_cp,'o') 

的變化點在這種情況下,該指數爲22。

情節數據及其變化點在紅色圓圈的:

enter image description here

+1

謝謝!這很酷。我必須等待22小時才能獎勵賞金。 – user2861089

0

可以使用sgolayfilt功能,即一個多項式擬合到數據,或再現OLS方法:http://www.utdallas.edu/~herve/Abdi-LeastSquares06-pretty.pdf(有一個+ BX符號代替斧+ B

對於斧的線性擬合+ b

如果更換與長度爲2n + 1的常數矢量x:[-n,... 0 ... n]的每個步驟中,將獲得的滑動下面的代碼迴歸係數:

for i=1+n:length(y)-n 
    yi = y(i-n : i+n); 
    sum_xy = sum(yi.*x); 

    a(i) = sum_xy/sum_x2; 
    b(i) = sum(yi)/n; 
end 

注意在這個代碼b意味着滑動數據的平均值,和一個最小二乘斜率估計(一階導數)。

+0

感謝您的建議 - 您能否提供一個如何在上面的示例中將其應用於我的'data'的示例? – user2861089

+0

只需將此代碼放入(y,n)的matlab函數中,並返回a,b值(y代表您的數據)。 – Sairus

+0

是的,謝謝,這是什麼? – user2861089