在matlab中拟合分段回归并找到变化点

时间:2017-04-12 07:17:06

标签: matlab

在matlab中,我想拟合分段回归并找到x轴上第一个变化点出现的位置。例如,对于以下数据,输出可能是changepoint=20(我实际上并不想绘制它,只想要更改点)。

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,'.')

2 个答案:

答案 0 :(得分: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 :(得分:0)

你可以使用sgolayfilt函数,这是一个适合数据的多项式,或者重现OLS方法:http://www.utdallas.edu/~herve/Abdi-LeastSquares06-pretty.pdf(有 a + bx 符号而不是 ax + b

ax + 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 表示数据的滑动平均值, a 是最小二乘斜率估计值(第一个推导值)。