多项式回归

在用回归分析方法作数据拟合时,很多情况下很难写出回归函数的解析表达式,例如股票历史价格的拟合,海岸线拟合,地形曲面拟合等。此时,可借助于多项式回归,根据已知的变量观测数据,构造出一个易于计算的多项式函数来描述变量间的不确定性关系,还可以利用该函数计算非数据节点的变量近似值。

1 多项式回归模型

对于可控变量x和随机变量y的m(m>n)次独立的观测(xi,yi),i=1,2,....,m,若y(因变量,也称为响应变量)和x(自变量)之间的回归模型为:

yi=p1*xi^n+p2*xi^n-1+....+pn*xi+pn+1 +a

a~N(o,aa^2), i=1,2,....m

其中p1,p2,.....,pn+1为未知参数,yi为回归多项式模型

.2 多项式回归的MATLAB实现

(1)polyfit函数的用法

MATLAB中提供了polyfit函数,用来做多项式曲线拟合,求解yi=p1*xi^n+p2*xi^n-1+....+pn*xi+pn+1 +a中的未知参数,polyfit函数的调用格式如下:

<1>p=polyfit(x,y,n)

返回n次(阶)多项式回归方程中系数向量的估计值p,这里的p是一个1x(n+1)的行向量,按降幂排列。输入参数x为自变量观测值向量,y为因变量观测值向量,n为正整数,用来指定多项式的阶数。

<2>[p,s]=polyfit(x,y,n)

还返回一个结构体变量s,可作为polyval函数的输入,用来计算预测值及误差的估计值。s有一个normr字段,字段值为残差的模,其值越小,表示拟合越精确。

<3>[p,s,mu]=polyfit(x,y,n)

首先对自变量x进行标准化变换,x=(x-u)/a ;这里u为x的均值,a为x的标准差,然后对y和标准化变换后的x作多项式回归,返回系数向量的估计值p,结构体变量s,已及mu=[u,a]

(2)polyval函数的用法

MATLAB提供了polyval函数,用来根据多项式系数向量计算多项式的值,调用格式如下:

<1>y=polyval(p,x)

计算n次多项式y=p1*x^n+....+pn*x+pn+1在x处的值,输入参数p=[p1,p2,.....,pn]为系数向量,按降幂排列,x为用户指定的自变量取值向量。输出参数y是与x等长的向量。

<2>[y,delta]=polyval(p,x.s)

根据polyfit函数返回的系数向量p和结构体s计算因变量y的预测值,已经误差的标准差的估计值delta。若误差相互独立,服从同方差的正态分布,则[y-delta,y+delta]可作为预测值的50%置信区间。

<3>y=polyval(p,x,[ ],mu) 或[y,delta]=polyval(p,x,s,mu)

首先对自变量x进行标准化变换,然后进行相应的计算,输入参数mu是polyfit函数的第3个输出参数。

(3)poly2sym函数的用法

MATLAB中提供了poly2sym函数,用来把多项式系数向量转为符号多项式,调用格式如下:

<1> r=poly2sym(p)

根据多项式系数向量p生成多形式的符号表达式r。输入参数p是按降幂排列的多项式系数向量

3 多项式回归示例

现有我国2007年1月到2011年11月的食品价格分类指数数据,如下,根据这些数据研究全国食品零售价格分类指数(上年同月=100)和时间的关系。

(1)数据的散点图

用序号表示时间,记为x,用y表示全国食品零售价格分类指数(上年同月=100)。由于x和y均为一维变量,可以先从x和y的散点图上直观地观察他们之间的关系,然后在做进一步的分析。

[Data,Textdata] = xlsread('食品价格.xls'); %读取数据

x = Data(:,1); %提取Data中的第一列,即观测序号

y = Data(:,3); %提取Data中第3列,即价格指数数据

figure;

plot(x,y,'k.','Markersize',15); %绘制x,y的散点图

xlabel('时间序号');

ylabel('食品零售价格分类指数');

散点图表明x和y的非线性趋势比较明显,可以用多项式曲线进行拟合。

(2)四次多项式拟合

假设y关于x的理论回归方程为:

y=p1*x^4+p2*x^3+p3*x^2+p4*x+p5

其中,p1,p2,p3,p4,p5为未知参数,下面调用polyfit函数求解方程中的未知参数,然后调用poly2sym函数显示多项式的符号表达式

[p4,S4] = polyfit(x,y,4)

r = poly2sym(p4);

r = vpa(r,5) %用vpa函数控制r的精度,保留5位有效数字

p4 =

-0.0001 0.0096 -0.3985 5.5635 94.2769

S4 =

R: [5x5 double]

df: 54

normr: 21.0375

r =

- 0.000074268*x^4 + 0.0096077*x^3 - 0.39845*x^2 + 5.5635*x + 94.277 %与p4向量不完全一致是由于舍入误差的原因

(3)更高次多项式拟合

下面调用polyfit函做更高次(>4)多项式拟合,并把多次拟合的残差的模加以对比

[p5,S5] = polyfit(x,y,5);

S5_normr=S5.normr

[p6,S6] = polyfit(x,y,6);

S6_normr=S6.normr

[p7,S7] = polyfit(x,y,7);

S7_normr=S7.normr

[p8,S8] = polyfit(x,y,8);

S8_normr=S8.normr

[p9,S9] = polyfit(x,y,9);

S9_normr=S9.normr

S5_normr =

21.0359

S6_normr =

16.7662

S7_normr =

12.3067

S8_normr =

11.1946

S9_normr =

10.4050

结果表明,随着多项式次数的提高,残差的模呈下降趋势,单纯从拟合的角度来看,拟合精度会随着多项式次数的提高而提高。

(4)拟合效果图

调用polyval函数计算给定自变量x处的因变量y的预测值,来绘制拟合效果图,从效果图上直观的观察出拟合的准确性

figure;

plot(x,y,'k.','Markersize',15); %x和y的散点图

xlabel('时间序号');

ylabel('食品零售价格分类指数');

hold on;

yd4 = polyval(p4,x);%计算4次多项式拟合的预测值

yd6 = polyval(p6,x);%计算6次多项式

yd8 = polyval(p8,x);% 8次多项式

yd9 = polyval(p9,x);% 9次多项式

plot(x,yd4,'r:+'); %绘制4次多项式拟合曲线

plot(x,yd6,'b--s'); % 6

plot(x,yd8,'g-.d'); % 8

plot(x,yd9,'k-p'); % 9

legend('原始散点','4次多项式拟合','6次多项式拟合','8次多项式拟合','9次多项式拟合')

1.《matlab如何求解多项式》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《matlab如何求解多项式》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/3262617.html