MATLAB 回归分析

一元线性回归与多项式回归

MATLAB 提供了 polyfit 函数来进行一元回归,包括线性回归和多项式回归。

polyfit 函数的语法为:

1
p = polyfit(x,y,n)

其中,xy 分别为自变量和因变量,n 为多项式的阶数,p 为拟合多项式的系数。当 n 为 1 时,为线性回归。

使用 polyval 函数可以计算拟合多项式的值:

1
y = polyval(p,x)

其中,p 为拟合多项式的系数,x 为自变量,y 为因变量。

使用线性回归拟合美国人口数据:

年份17901800181018201830184018501860187018801890
人口/百万3.95.37.29.612.917.123.231.438.650.262.9
年份19001910192019301940195019601970198019902000
人口/百万76.292.2106.5123.2132.2151.3179.3203.2226.5249.6281.4
1
2
3
4
5
x = 1790:10:2000;
y = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.2 92.2 106.5 123.2 132.2 151.3 179.3 203.2 226.5 249.6 281.4];
p = polyfit(x,y,1);
y_hat = polyval(p,x);
plot(x,y,'o',x,y_hat,'-'),grid on,legend('原始数据','预测结果'),xlabel('年份'),ylabel('人口/百万')

图1

可以看出美国人口增长趋势不是线性的,使用线性回归拟合的结果并不理想。

我们换用 2 次多项式进行拟合:

1
2
3
4
5
x = 1790:10:2000;
y = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.2 92.2 106.5 123.2 132.2 151.3 179.3 203.2 226.5 249.6 281.4];
p = polyfit(x,y,2);
y_hat = polyval(p,x);
plot(x,y,'o',x,y_hat,'-'),grid on,legend('原始数据','预测结果'),xlabel('年份'),ylabel('人口/百万')

图2

可以看出,使用 2 次多项式拟合的结果就要比一次多项式拟合的结果好很多。

根据泰勒公式,我们可以使用高阶多项式来拟合任意的函数,无论函数图像有多么复杂。


多元线性回归

MATLAB 提供了 regress 函数来进行多元线性回归。

regress 函数的语法为:

1
b = regress(y,X)

其中,y 为因变量,X 为自变量矩阵,b 为回归系数。如果需要拟合包括常数项的多元线性回归模型,需要在自变量矩阵 X 中添加一列全为 1 的列向量。

加载 carsmall 数据集。使用加速度 Acceleration、和排量 Displacement 来预测每加仑里程数 MPG。

1
2
3
4
5
6
load carsmall
x1 = Acceleration;
x2 = Displacement;
X = [x1 x2 x1.*x2 ones(size(x1))]; % 添加交互效应项和常数项
y = MPG;
b = regress(y,X)

输出拟合系数:

1
2
3
4
5
b =
0.3821
-0.0160
-0.0039
32.0143

绘制拟合曲面:

1
2
3
4
5
6
7
8
9
10
11
scatter3(x1,x2,y,'filled')
hold on
x1fit = min(x1):(max(x1)-min(x1))/25:max(x1);
x2fit = min(x2):(max(x2)-min(x2))/25:max(x2);
[X1FIT,X2FIT] = meshgrid(x1fit,x2fit);
YFIT = b(1)*X1FIT + b(2)*X2FIT + b(3)*X1FIT.*X2FIT + b(4);
mesh(X1FIT,X2FIT,YFIT)
xlabel('Acceleration')
ylabel('Displacement')
zlabel('MPG')
hold off

图3


非线性回归

MATLAB 提供了 nlinfit 函数来进行多元非线性回归。

nlinfit 函数的语法为:

1
beta = nlinfit(X,Y,modelfun,beta0)

其中,X 为自变量矩阵,Y 为因变量,modelfun 为模型函数,beta0 为初始值,beta 为回归函数参数。

MATLAB 阻滞增长模型