回归与曲线拟合
我们经常需要把观测到的数据表达为函数,假如有如下的对时间的观测:
t = [0 .3 .8 1.1 1.6 2.3]’;
y = [0.5 0.82 1.14 1.25 1.35 1.40]’;
plot(t,y,’o’),
grid on
多项式回归
由图可以看出应该可以用多项式来表达:y=a0+a1*t+a2*t^2
系数a0,a1,a2可以由最小平方拟合来确定,这一步可由反除号"\"来完成
解下面的三元方程组可得:
X = [ones(size(t)) t t.^2]
X =
1.0000 0 0
1.0000 0.3000 0.0900
1.0000 0.8000 0.6400
1.0000 1.1000 1.2100
1.0000 1.6000 2.5600
1.0000 2.3000 5.2900
a = X\y
a =
0.5318 0.9191 –0.2387
a即为待求的系数,画图比较可得
T = (0:0.1:2.5)’;
Y = [ones(size(T)) T T.^2]*a;
plot(T,Y,'–',t,y,'o',), grid on
结果令人失望,但我们可以增加阶数来提高精确度,但更明智的选择是用别的方法.
线性参数回归
形如:y=a0+a1*exp(-t)+a2*t*exp(-t)
计算方法同上:
X = [ones(size(t)) exp(– t) t.*exp(– t)];
a = X\y
a =
1.3974 – 0.8988 0.4097
T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(– T) T.exp(– T)]*a;
plot(T,Y,'–',t,y,'o'), grid on
看起来是不是好多了!
例子研究:曲线拟合
下面我们以美国人口普查的数据来研究一下有关曲线拟合的问题(MatLab是别人的,教学文档是别人的,例子也是别人的,我只是一个翻译而已...)
load census
这样我们得到了两个变量,cdate是1790至1990年的时间列向量(10年一次),pop是相应人口数列向量.
上一小节所讲的多项式拟合可以用函数polyfit()来完成,数字指明了阶数
p = polyfit(cdate,pop,4)
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 5.429790e–20
p =
1.0e+05 *
0.0000 –0.0000 0.0000 –0.0126 6.0020
产生警告的原因是计算中的cdata值太大,在计算中的Vandermonde行列式使变换产生了问题,解决的方法之一是使数据标准化.
预处理:标准化数据
数据的标准化是对数据进行缩放,以使以后的