在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,'.')
答案 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。
数据图及其变化点以红色圈出:
答案 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 是最小二乘斜率估计值(第一个推导值)。