数据分析和统计(二)

作者在 2007-07-06 23:53:00 发布以下内容

回归与曲线拟合

  我们经常需要把观测到的数据表达为函数,假如有如下的对时间的观测:

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行列式使变换产生了问题,解决的方法之一是使数据标准化

预处理:标准化数据

数据的标准化是对数据进行缩放,以使以后的

matlab | 阅读 1662 次
文章评论,共0条
游客请输入验证码