✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
一元线性回归与多项式回归
MATLAB 提供了 polyfit
函数来进行一元回归,包括线性回归和多项式回归。
polyfit
函数的语法为:
p = polyfit(x,y,n)
其中,x
和 y
分别为自变量和因变量,n
为多项式的阶数,p
为拟合多项式的系数。当 n
为 1 时,为线性回归。
使用 polyval
函数可以计算拟合多项式的值:
y = polyval(p,x)
其中,p
为拟合多项式的系数,x
为自变量,y
为因变量。
例
使用线性回归拟合美国人口数据:
年份 | 1790 | 1800 | 1810 | 1820 | 1830 | 1840 | 1850 | 1860 | 1870 | 1880 | 1890 |
---|---|---|---|---|---|---|---|---|---|---|---|
人口/百万 | 3.9 | 5.3 | 7.2 | 9.6 | 12.9 | 17.1 | 23.2 | 31.4 | 38.6 | 50.2 | 62.9 |
年份 | 1900 | 1910 | 1920 | 1930 | 1940 | 1950 | 1960 | 1970 | 1980 | 1990 | 2000 |
---|---|---|---|---|---|---|---|---|---|---|---|
人口/百万 | 76.2 | 92.2 | 106.5 | 123.2 | 132.2 | 151.3 | 179.3 | 203.2 | 226.5 | 249.6 | 281.4 |
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('人口/百万')
可以看出美国人口增长趋势不是线性的,使用线性回归拟合的结果并不理想。
我们换用 2 次多项式进行拟合:
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 次多项式拟合的结果就要比一次多项式拟合的结果好很多。
根据泰勒公式,我们可以使用高阶多项式来拟合任意的函数,无论函数图像有多么复杂。
多元线性回归
MATLAB 提供了 regress
函数来进行多元线性回归。
regress
函数的语法为:
b = regress(y,X)
其中,y
为因变量,X
为自变量矩阵,b
为回归系数。如果需要拟合包括常数项的多元线性回归模型,需要在自变量矩阵 X
中添加一列全为 1 的列向量。
例
加载 carsmall 数据集。使用加速度 Acceleration、和排量 Displacement 来预测每加仑里程数 MPG。
load carsmall
x1 = Acceleration;
x2 = Displacement;
X = [x1 x2 x1.*x2 ones(size(x1))]; % 添加交互效应项和常数项
y = MPG;
b = regress(y,X)
输出拟合系数:
b =
0.3821
-0.0160
-0.0039
32.0143
绘制拟合曲面:
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
非线性回归
MATLAB 提供了 nlinfit
函数来进行多元非线性回归。
nlinfit
函数的语法为:
beta = nlinfit(X,Y,modelfun,beta0)
其中,X
为自变量矩阵,Y
为因变量,modelfun
为模型函数,beta0
为初始值,beta
为回归函数参数。
例