这里是简单做一元非线性,及多元线性。
一元:就是只有一个X。比如:y=x^2+x+1;
多元:就是多个X,比如:y=x1+x2+1;
首先几对数据,你得大约能知道他们是什么关系。
百度百科:
MATLAB软件提供了基本的曲线拟合函数的命令,多项式函数拟合:a=polyfit(xdata,ydata,n),
其中n表示多项式的最高阶数,xdata,ydata为将要拟合的数据,它是用数组的方式输入。输出参数a为拟合多项式 y=a1x^n+…+anx+a,共n+1个系数。
多项式在x处的值y可用下面程序计算。
y=polyval(a,x,m)
线性:m=1, 二次:m=2, …
polyfit的输出是一个多项式系数的行向量。为了计算在xi数据点的多项式值,调用MATLAB的函数polyval。
close all;clear all;
x=[0,10,50,100,150,200,250,300,350,400,450,500,550,600]';
y=[0,792.5,1976,3410,4794,6127,7411,8644,9827,10960,12040,13070,14060,14990]';
plot(x,y);
%% 一元线非线性回归
[p,S] = polyfit(x,y,2);%polyfit函数基于最小二乘法, 如果是用一元polyfit(x,y,1) 则结果p与regress()结果b 是一样的
%%拟合后对应的多项式即为y=p(1)*x^n + p(2)*x^(n-1) +…+ p(n)*x + p(n+1)。
%S是规模为1×1的结构数组,包括R(系数矩阵的QR分解的上三角阵),df(自由度),normr(拟合误差平方和的算术平方根)。
%%
p,
f=polyval(p,x);%作出拟合函数
figure();
plot(x,y,x,f);
title( "一元线非线性回归")
%% 相关系数
r=corrcoef(x,y);
r,
%%
结果:
p =
-0.0116 31.3118 317.3271
表达式为 y=-0.0116x^2+31.3118x+317.3271;
regress用于一元及多元线性回归,本质上是最小二乘法。在Matlab 2014a中,输入help regress ,会弹出和regress的相关信息。
对应生成的表达式 为y=b1+x1b2+x2b3 +…+x(n)* b(n+1),
调用格式:
B = regress(Y,X)
[B,BINT] = regress(Y,X)
[B,BINT,R] = regress(Y,X)
[B,BINT,R,RINT] = regress(Y,X)
B,BINT,R,RINT,STATS] = regress(Y,X)
[...] = regress(Y,X,ALPHA)
参数解释:
B:回归系数,是个向量(“the vector B of regression coefficients in the linear model Y = X*B”)。
BINT:回归系数的区间估计(“a matrix BINT of 95% confidence intervals for B”)。
R:残差( “a vector R of residuals”)。
RINT:置信区间(“a matrix RINT of intervals that can be used to diagnose outliers”)。
STATS:用于检验回归模型的统计量。有4个数值:判定系数R^2,F统计量观测值,检验的p的值,误差方差的估计。
ALPHA:显著性水平(缺少时为默认值0.05)。
close all;clear all;
x=[0,10,50,100,150,200,250,300,350,400,450,500,550,600]';
y=[0,792.5,1976,3410,4794,6127,7411,8644,9827,10960,12040,13070,14060,14990]';
plot(x,y);
X=[ones(14,1),x];%ones是一个项全1的数据,用来生成b1常数项的
%x=[ones(14,1),x1,x2,x3]; % 如有x2 x3 多元数据项,
[b,bint,r,rint,stats]=regress(y,X);%基于最小二乘法
% y=b1+x1*b2+x2*b3 +…+x(n)* b(n+1) b为对应的参数 b1为F(最后那个常数项) ,b2为x1(第一个参数),b3为x2,b4为x3,b5为x4,b6为E。bint为b的95%置信区间
%%
figure();
Y=x*b(2)+b(1);
plot(x,y,x,Y);
lgd = legend('原线','回归线','Location','North');
set(lgd,'Orientation','horizon','Box','off')
title( "多元线性回归");
figure();
b,bint,stats,rcoplot(r,rint) %rcoplot是用来画残差图的,以便发现异常点
结果:
b =
832.0708
24.6682
bint =
1.0e+03 *
0.4087 1.2554
0.0234 0.0259
stats =
1.0e+05 *
0.0000 0.0187 0.0000 1.7337
利用nlinfit函数实现数据非线性拟合